Sto usando EFCore per inviare i dati al back-end db, chiamo SaveChanges
per ogni un certo numero di nuovi oggetti aggiunti al set di dati, ho notato dal log di debug EFCore che chiuderà la connessione e ne aprirà una nuova ogni volta che chiamerò SaveChanges
:
Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerConnection|DEBUG|Opening connection to database ...
Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerConnection|DEBUG|Beginning transaction with isolation level 'Unspecified'.
Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerConnection|DEBUG|Committing transaction
Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerConnection|DEBUG|Closing connection to database...
.... the logs repeats forever
Quindi esiste comunque l'uso di una sola connessione per l'intero ciclo di vita di un DbContext
?
Non è necessario per voi cambiare il modo in cui funziona, o addirittura preoccuparsene affatto. Per impostazione predefinita, le connessioni di SQL Server vengono semplicemente rimesse in un pool di connessioni, quindi in realtà non vengono chiuse. L'apertura di una nuova sarà solo afferrare il prossimo disponibile in piscina.
È possibile controllare il pool se si desidera realmente impostando i valori nella stringa di connessione, mentre vorrei sconsigliare che, a meno che non si sia veramente a conoscenza di ciò che si sta facendo, queste sono le proprietà principali utilizzate (da MSDN ):
Durata connessione : quando una connessione viene restituita al pool, il tempo di creazione viene confrontato con l'ora corrente e la connessione viene distrutta se tale intervallo di tempo (in secondi) supera il valore specificato da Connection Lifetime. Ciò è utile nelle configurazioni cluster per forzare il bilanciamento del carico tra un server in esecuzione e un server appena portato in linea. Un valore pari a zero (0) causerà il timeout massimo delle connessioni in pool.
Reset connessione : determina se la connessione al database viene ripristinata quando viene rimossa dal pool. Per Microsoft SQL Server versione 7.0, l'impostazione su false evita di effettuare un round trip aggiuntivo del server quando si ottiene una connessione, ma è necessario tenere presente che lo stato della connessione, come il contesto del database, non viene ripristinato.
Enlist : quando true, il pooler attiva automaticamente la connessione nel contesto corrente della transazione del thread di creazione se esiste un contesto di transazione.
Dimensione massima piscina : il numero massimo di connessioni consentite nel pool.
Dimensioni min piscina : il numero minimo di connessioni gestite nel pool.
Pooling : se true, la connessione viene creata dal pool appropriato o, se necessario, creata e aggiunta al pool appropriato.