Domanda

Ad esempio, devo riempire un sacco di DataTable con il metodo Fill () di SQLDataAdapter:

DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
....
....

Anche tutti gli oggetti dataadapter usano lo stesso SQLConnection, ogni metodo Fill aprirà e chiuderà la connessione a meno che lo stato della connessione non sia già aperto prima della chiamata del metodo.

Quello che voglio sapere è come l'apertura e la chiusura non necessarie delle connessioni SQLC influiscono sulle prestazioni dell'applicazione. Quanto deve ridimensionare per vedere gli effetti negativi di questo problema (100.000 utenti simultanei?). In un sito Web di medie dimensioni (50000 utenti giornalieri) vale la pena preoccuparsi e cercare tutte le chiamate Fill (), tenerle insieme nel codice e aprire la connessione prima di qualsiasi chiamata Fill () e chiudere in seguito?

È stato utile?

Soluzione

ADO.NET ha un pool di connessioni, ad es. quando chiudi una connessione, non è completamente completamente chiusa, ma "riciclata" se chiedi una nuova connessione con esattamente la stessa stringa di connessione.

Tuttavia - se già sai in anticipo che dovrai chiamare questi cinque metodi Fill uno per uno, lo consiglio vivamente

  • apertura della connessione
  • leggendo tutte e cinque le tabelle di dati dal database
  • chiudendo di nuovo subito la connessione

È accettata la migliore pratica per farlo in questo modo, non ti fa male - quindi fallo e basta! :-)

Marc

PS: il pool di connessioni in ADO.NET ovviamente funziona solo se non lo hai disattivato! :-) È attivo di default - dovresti disabilitarlo esplicitamente.

Altri suggerimenti

Punto chiave:

  • Perché aprire, conservare e riutilizzare le connessioni?

    Performance

Ci sono molti motivi per cui potresti voler aprire e chiudere le connessioni. Devi decidere dove è il miglior compromesso per il tuo utilizzo. Puoi fare entrambe le cose: utilizzare una connessione aperta per un periodo di tempo e / o un numero prestabilito di transazioni, quindi chiuderla e aprirne una nuova.

L'apertura e la chiusura delle connessioni SQL sono costose rispetto ad altre semplici attività nel database. Ma se il tuo compito effettivo richiede già molto tempo, l'overhead aggiuntivo potrebbe non essere notato (se stai già nascondendo il periodo di attesa dell'attività effettiva, quindi l'utente non inizia a fare clic casualmente su cose, come riprovare).

Caso di prova:

Puoi misurare la tua differenza scrivendo due versioni di una query di prova. Seleziona qualsiasi attività SQL semplice (deve essere la stessa in ogni versione).

Nella versione uno , fallo con una singola connessione aperta costante esterno il ciclo, eseguendo il ciclo attraverso la tua semplice attività X numero di volte.

Nel secondo , fallo con l'apertura e la chiusura della connessione dentro il ciclo.

Modifica il numero X di volte in modo che corrisponda a il tuo utilizzo e aspettative. Ciò dovrebbe darti un'idea davvero positiva dell'impatto sul tuo sistema

Spero che ti aiuti a capire le basi ... Jack.

RISPOSTA NECRO: Il modo migliore è inserire la connessione in un'istruzione "using" in modo che sia orientata al lavoro che deve svolgere:

using (SqlConnection conn = new SqlConnection())
{
    DataAdapter1.Fill(DataTable1);
    DataAdapter2.Fill(DataTable2);
    DataAdapter3.Fill(DataTable3);
    DataAdapter4.Fill(DataTable4);
    DataAdapter5.Fill(DataTable5);
    ...
    ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top