10

Ho un grosso problema qui, bene al mio server.Più di 100 connessioni a SQL Server 2008 in stato di "sospensione"

Ho un ASP .net web (framework 4.x) in esecuzione sul mio server, tutte le transazioni/select/update/insert sono fatte con ADO.NET.

Il problema è che dopo essere stato usato per un po '(un paio di aggiornamenti/seleziona/inserti) a volte ho avuto più di 100 connessioni in stato "dormiente" quando assegno per le connessioni su SQL server con questa query:

Ho controllato il mio codice e chiuso ogni volta che faccio una connessione, sto testando la nuova classe, ma temo che il problema non venga risolto.

Supponiamo che il pool di connessioni mantenga le connessioni per riutilizzarle, ma fino a quando non vedo riutilizzarle sempre.

Qualche idea oltre a verificare la chiusura di tutte le connessioni aperte dopo l'uso?

RISOLTO (ora ho solo una bella e collegamento sullo stato di "sonno"):

Oltre alla anwser di David Stratton, vorrei condividere questo link che aiutano a spiegare molto bene come il pool di connessione funziona: http://dinesql.blogspot.com/2010/07/sql-server-sleeping-status-and.html

Giusto per essere breve, è necessario chiudere ogni connessione (gli oggetti di connessione SQL) in modo che il pool di connessioni può ri-utilizzare la connessione e utilizzare la stessa stringa connectinos, per garantire questo è altamente raccomandato l'uso uno dei webConfig.

Attenzione ai dataReader è necessario chiudere la connessione a (questo è ciò che mi fa impazzire per un po ').

+0

Si potrebbe ottenere maggiori e migliori risposte sopra a [dba.stackexchange.com] (http://dba.stackexchange.com), dove il DBA a tempo pieno di appendere fuori –

risposta

16

Sembra che si tratti di un pool di connessioni.

Da qui: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

un pool di connessioni viene creato per ogni stringa di connessione unica. Quando viene creato un pool , più oggetti di connessione vengono creati e aggiunti a il pool in modo che venga soddisfatto il requisito della dimensione minima del pool. Le connessioni vengono aggiunte al pool in base alle esigenze, fino alla dimensione massima del pool specificata (100 è l'impostazione predefinita). I collegamenti vengono restituiti nel pool quando vengono chiusi o eliminati.

Per garantire che non vengano creati pool non necessari, verificare che venga utilizzata la stessa stringa di connessione esatta ogni volta che si effettua la connessione: memorizzarla nel file .config.

Se lo desideri, puoi anche ridurre la dimensione massima del pool.

In realtà, mi consiglia di leggere solo l'intero articolo collegato sopra. Parla della cancellazione dei pool e offre le migliori pratiche per utilizzare correttamente il pooling.

Modifica - ha aggiunto il giorno dopo

Le piscine sul server ci sono a causa di come funziona pooling Connection. Per la documentazione legata alla sopra:

Il Pooler collegamento rimuove una connessione dal pool dopo che è rimasto inattivo per un lungo periodo di tempo, o se il Pooler rileva che la connessione con il server è stata interrotta. Si noti che una connessione interrotta può essere rilevata solo dopo aver tentato di comunicare con il server . Se viene rilevata una connessione che non è più connessa al server , viene contrassegnata come non valida. Le connessioni non valide vengono rimosse dal pool di connessioni solo quando vengono chiuse o recuperate.

Ciò significa che il server stesso eliminerà eventualmente tali pool, se rimangono inutilizzati. Se NON vengono ripuliti, significa che il server crede che le connessioni siano ancora in uso e si aggrappi a esse per aumentare le prestazioni.

In altre parole, non mi preoccuperei se non si vede un problema. Il pool di connessioni sta accadendo esattamente come dovrebbe essere.

se si vuole veramente cancellare le piscine, ancora una volta, per la documentazione:

Cancellazione del Pool

ADO.NET 2.0 introdotto due nuovi metodi per chiara la piscina: ClearAllPools e ClearPool. ClearAllPools cancella i pool di connessione per un determinato provider e ClearPool cancella il pool di connessione associato a una connessione specifica. Se ci sono connessioni in uso al momento della chiamata, sono contrassegnate con in modo appropriato. Quando sono chiusi, vengono scartati invece di essere restituiti al pool.

Tuttavia, se si desidera regolare il pool, è possibile modificare la stringa di connessione. Vedere questa pagina, e cercare la parola "pool":

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

Oppure si può arruolare un DBA per assistere e impostare mettere in comune a livello di server. Questo è fuori tema qui, ma ServerFault.com potrebbe avere delle persone che assistono lì.

+0

Ciao, prima di chiedere finisco per leggere questo articolo. Ma cosa intendi con la stessa stringa di connessione? intendi l'oggetto o la stringa, cercherò di usare anche il webConfig invece degli attributi della classe. Dove posso limitare il pool di connessioni? Grazie. – Allende

+0

Immagino che tutte le risposte siano qui http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx Mi dispiace. Lo controllerò e alla fine aggiorno la domanda. – Allende

+0

Non riesco a capire il modo giusto di usare la "stessa stringa di connessione" Ora lo uso dalla web config e ho ancora un sacco di connessioni sullo stato "dormendo" – Allende

Problemi correlati