2011-01-05 17 views
5

Attualmente abbiamo una piccola situazione nelle nostre mani - sembra che qualcuno, da qualche parte, abbia dimenticato di chiudere la connessione nel codice. Il risultato è che il pool di connessioni è esaurito in modo relativamente rapido. Come patch temporanea abbiamo aggiunto Max Pool Size = 500; alla nostra stringa di connessione sul servizio web e al pool di riciclo quando tutte le connessioni sono state spese, finché non lo scopriamo.Tutte le connessioni nel pool sono in uso

Finora non abbiamo fatto questo:

SELECT SPId 
FROM MASTER..SysProcesses 
WHERE DBId = DB_ID('MyDb') and last_batch < DATEADD(MINUTE, -15, GETDATE()) 

per ottenere SPID di che non sono utilizzati per 15 minuti. Stiamo cercando di ottenere la query che è stato eseguito lo scorso utilizzando tale SPID con:

DBCC INPUTBUFFER(61) 

ma le query visualizzate sono vari, che significa sia qualcosa sul livello di base per quanto riguarda la manipolazione di collegamento era rotto, o la nostra deduzione è errata. ..

C'è un errore nel nostro modo di pensare qui? Il DBCC/sysprocesses dà risultati che ci aspettiamo o c'è qualche effetto collaterale? (Ad esempio, i collegamenti in piscina influenza?)

(per favore, attenersi a ciò che siamo riusciti a scoprire l'utilizzo di SQL in quanto i ragazzi che hanno fatto il codice sono molte e non tutte presenti in questo momento)

+3

'i ragazzi che hanno fatto il codice sono molti e non tutti presenti in questo momento'. Non penso che fossero tutti lì quando hanno dimenticato di chiudere le loro connessioni SQL. ;) –

+0

hai il codice sorgente giusto? Non dovrebbe essere difficile cercare tutte le connessioni aperte e chiuderle, a condizione che non passino deliberatamente le connessioni intorno ... –

+1

@will @mitch - tu * non * vuoi guardare il codice, fidati di me :) ma, alla fine, questa era l'unica opzione alla fine ... e l'abbiamo risolto mettendo try-finally {close} ovunque ... – veljkoz

risposta

2

Mi aspetterei che c'è una miriade di diverse query 'ricordate' da inputbuffer - a seconda del momento del fallimento e della varietà di query eseguite, sembra improbabile che si vedano query coerenti in questo modo. Ricorda che le connessioni saranno eventualmente chiuse, ma solo quando sono convertite in GC e finalizzate.

Come suggerisce Mitch, è necessario setacciare la fonte per la connessione-apre e assicurarsi che siano localizzati e avvolti in un using(). Cerca anche oggetti possibilmente longevi che potrebbero rimanere attaccati alle connessioni. In una prima versione del nostro catalogo, gli oggetti della pagina ASP contenevano connessioni che non erano gestite correttamente.

Per restringere il campo, puoi monitorare i conteggi delle connessioni (perfmon) mentre ti concentri su parti specifiche della tua app? Succede di più nelle aree CRUD rispetto alla segnalazione o ad altre domande? Questo potrebbe aiutare a restringere la fonte-setacciatura che devi fare.

+0

Dopo aver attraversato freneticamente il codice e messo ovunque il 'try - finally {conn.Close()}' siamo riusciti a salvare il problema ... il design della classe del controller anti-pattern era (** è **) un horror ... ci sarà sculacciata al mattino, questo è sicuro;) grazie a tutti ... – veljkoz

+0

@Mitch: Se si tratta della connessione DB di .NET, il finalizzatore chiamerà dispose che libererà le risorse non gestite. Succede solo a un tempo indeterminato a causa del tempo di GC. – n8wrl

+0

@veljkoz: Probabilmente lo sai, ma puoi risparmiare un po 'digitando le tue connessioni nei blocchi using() che effettivamente fanno il try/finally per te. – n8wrl

1

Sei in grado di modificare le stringhe di connessione per contenere informazioni su dove e perché la connessione è stata creata nel campo Applicazione?

+0

Non sono sicuro di cosa intendi?Potresti fare un esempio? – veljkoz

+1

È possibile fornire una proprietà "Nome applicazione" di 128 caratteri che viene visualizzata in SQL: ciò può semplificare molto il debug delle connessioni canaglia (in ogni posizione univoca nell'app in cui viene creata la connessione utilizzare un nome diverso). Vedi http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx. –

Problemi correlati