2010-07-27 13 views
9

Sto usando ADO.Net per alcune connessioni di database e speravo solo di farlo nel modo giusto. Sto aprendo e chiudendo più connessioni per ogni stored procedure. O dovrei fare il wrapping in una sola connessione aperta (meno risorse sul database forse?) Grazie, e se c'è qualcosa di strano o qualcosa che potrei fare meglio fammi sapere grazie!Le migliori pratiche? apri e chiudi connessioni multiple o una grande connessione aperta per ado.net

Esempio: questo, ma ho come 6 di loro ...

using (SqlConnection conn = new SqlConnection(ConnectionString)) 
{ 
    SqlCommand cmd = new SqlCommand("spSelectAllTrip", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    conn.Open(); 
    ddlTripTypeA.DataSource = cmd.ExecuteReader(); 
    ddlTripTypeA.DataTextField = "TripType"; 
    ddlTripTypeA.DataValueField = "TripTypeAID"; 
    ddlTripTypeA.DataBind(); 
} 
using (SqlConnection conn = new SqlConnection(ConnectionString)) 
{ 
    SqlCommand cmd = new SqlCommand("spSelectAllTripB", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    conn.Open(); 
    ddlTripTypeB.DataSource = cmd.ExecuteReader(); 
    ddlTripTypeB.DataTextField = "TripType"; 
    ddlTripTypeB.DataValueField = "TripTypeBID"; 
    ddlTripTypeB.DataBind(); 
} 

risposta

5

.Net dispone di un pool di connessioni già gestito per te, quindi non devi preoccuparti di riutilizzare le connessioni come potresti avere con i vecchi asp. Vado sempre con alcune piccole chiamate rapide e mantenendo una aperta tutto il tempo, perché non sempre è aperto per le chiamate. Hai il codice del tuo sito in esecuzione facendo alcune cose tra pure.

Ora, se si effettuano 6 chiamate consecutive una dopo l'altra, potrebbe essere logico aprirne una e riutilizzarla. Ma a parte quello dico solo attenersi a quello che stai facendo.

L'unica cosa che si desidera esaminare è un gestore connessioni in modo che non si debba creare l'oggetto connessione in .net più e più volte. Ma questo non ha nulla a che fare con le connessioni db rispetto alla creazione di oggetti.

+2

avere un buon collegamento per il gestore di connessione? per C# – Spooks

+0

concordato, se si eseguono più elementi in un "batch", fare tutto il lavoro che è possibile, quindi chiudere presto; assicurati di non avere la connessione in giro. Quindi, per quanto possibile ... apri il db conn il più tardi possibile, esegui, chiudi il db conn il prima possibile e cerca di non mantenere la connessione aperta più a lungo del necessario. – SnapJag

3

Si dovrebbe tenere aperte le connessioni più breve tempo possibile. Pertanto, si desidera aprire una connessione, eseguire una query o una stored procedure e quindi chiudere la connessione. Anche se sembra costoso, sfrutta il pool di connessioni integrate di ADO.NET. Quando chiudi una connessione, viene restituito a un pool e riutilizzato in modo da non subire un calo di prestazioni.

+0

punto è moot, se tutte le operazioni contro la connessione si verificano nello stesso metodo. –

+0

@Mitch Wheat - È lo stesso metodo? Questo non è chiaro dal PO. – Thomas

+0

@Mitch Wheat - C'è anche un altro problema di interlingling del codice di accesso ai dati con il codice di presentazione ... – Thomas

0

ADO.Net utilizza il pool di connessioni, in modo da ridurre il costo di apertura di nuove connessioni evitando di dover aprire una connessione per l'intera applicazione.

Tuttavia, v'è probabilmente ancora alcuni in testa alle mischiare le connessioni nel pool, quindi se avete il codice che viene eseguito in modo sequenziale e subito, all'interno della stessa porzione di codice, allora si sono probabilmente meglio utilizzare un connessione singola per quella breve durata. Controlla la risposta di Adam per un po 'di più su questo - vuoi mettere tutto il resto al primo posto in modo che la connessione sia aperta per il minor tempo possibile.

Se qualche programmatore ADO.Net può confermare o correggere questo, si prega di fare.

+0

Sentitevi liberi di indicare cosa c'è che non va nella mia risposta quando mi votate in modo tale che, non lo so, forse le persone possono effettivamente imparare qualcosa –

+0

Non ero io, ma il pooling delle connessioni in .NET avviene automaticamente. A parte questo, quello che hai detto è praticamente corretto. –

+0

Grazie. Cambierò la mia risposta per riflettere questo. –

1

Un modo migliore per farlo sarebbe quello di preparare entrambi i comandi e quindi aprire la connessione e entrambi eseguire in rapida successione:

conn.Open(); 
comm1.ExecuteReader(); 
comm2.ExecuteReader(); 

tenerli sempre aperto per il minor tempo possibile.

+0

Dovrò fare un tentativo, sembra abbastanza pulito – Spooks

Problemi correlati