Devo ricalcolare i valori su una vasta raccolta di entità, una dopo l'altra.Molte query e troppa apertura/chiusura della stessa connessione
Durante questo processo, tutte le entità di auto-rilevamento vengono modificate all'interno dello stesso ObjectContext. Per ciascuna entità che deve essere elaborata, è necessario recuperare piccole quantità di dati dal database. Ciò si traduce in molte delle stesse query SQL ma utilizzando parametri diversi.
Sto usando Software ORM Profiler Solutions per profilare le query inviate al database.
Le domande stesse mi sembrano a posto. Sono brevi e non richiedono molto tempo per essere eseguiti.
Tuttavia, io sono confuso su come il profiler mi mostra come le query sono in realtà trattati:
Come si può vedere, continua apertura e chiusura della stessa connessione al database.
Ora, date un'occhiata alle volte per un unico aperto/Query/Chiude la connessione:
Sembra che l'apertura e la chiusura di un database tempo rifiuti di connessione.
Dopo aver letto this answer, ho cambiato il mio codice in modo ora sembra che questo:
using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString))
{
using (var context = new MyEntities(connection))
{
// ...
ora posso vedere che sta ancora utilizzando la stessa connessione (che è buono), ma, la connessione ancora continua a chiudersi e ad aprirsi tra le domande.
Gert Arnold suggerito di aprire esplicitamente la connessione prima di utilizzare il contesto. Ho quindi modificato il mio codice in modo che assomigli a questo:
using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString))
{
connection.Open();
using (var context = new MyEntities(connection))
{
// ...
Ora funziona! Ogni query viene inviata alla stessa connessione al database:
adesso sono curioso di motivo per cui ho bisogno di aprire la connessione prima di utilizzare il contesto?
Questo non è un duplicato. Posso effettivamente riutilizzare la stessa connessione. Il problema è che continua ad aprirsi/chiudersi tra le query. –
Si chiude anche quando si apre la connessione prima di creare il contesto? (A proposito, penso che il tuo codice non sia completamente corretto: 'new EntityConnection' due volte). –
Funziona! Ma solo se, come hai suggerito, apro esplicitamente la connessione prima di usare il contesto. Sai perché ? –