2013-08-16 16 views
5

Sto indagando questo errore da un'applicazione MVC3 che sta fallendo sotto carico:.Utilizzando Performance Monitor per monitorare le connessioni in pool

"Il periodo di timeout trascorso prima ottenere una connessione dal pool Questo potrebbe essersi verificato perché tutto le connessioni in pool erano in uso e la dimensione massima del pool è stata raggiunta. "

L'applicazione utilizza il modello di repository e Entity Framework e il mio sospetto è che non sta chiudendo correttamente le connessioni. Voglio essere in grado di monitorare il numero di connessioni in pool su SQL Server. Cercando in giro mi porta a credere che posso usare questi contatori in Perfmon:

  • .NET CLR dati
  • Provider
  • dati .NET per SQLServer

Tuttavia entrambi mostrare e di essere disabilitata/disattivata su.

Sto eseguendo Perfmon direttamente sul server e sia l'ISS che SQL Server sono in esecuzione sul server. Qualche idea sul perché questi contatori non sarebbero disponibili?

Ho anche provato a utilizzare SQL Profiler per monitorare le connessioni in pool, ma la colonna EventSubClass non è disponibile per AuditLogin.

+0

Il secondo contatore Credo sia quella corretta. Cosa intendi quando sei in grigio? Come in non è possibile aggiungere quei monitor? Hai accesso amministratore alla macchina? – DavidN

+0

Sì, se provo ad aggiungere quei monitor, non succede nulla. E io sono un amministratore sulla macchina – VincentH

risposta

6

È possibile eseguire questo da una finestra di query SQL per ottenere un conteggio e i dettagli delle connessioni correnti e della sessione in esecuzione sul server SQL.

select * FROM sys.dm_exec_sessions AS es 
INNER JOIN sys.dm_exec_connections AS ec 
ON es.session_id = ec.session_id 

Ho avuto problemi con le connessioni in pool. Sono difficili da controllare. Chiudendoli esplicitamente non sembrava funzionare perché sono sotto il controllo di .NET. Il motivo principale per cui abbiamo esaurito le connessioni sono le transazioni senza commit. Se una transazione non viene restituita o viene annullata per qualche motivo, la connessione, invece di essere riutilizzata, rimane bloccata nel limbo, costringendo .NET ad aprire un'altra connessione per continuare l'elaborazione.

+0

Questo sembra utile - ma mi dice se una connessione è in pool o no? – VincentH

+0

Sembra che non ci sia un modo dinamico e perquisito di trovare se una connessione live è in pool. Tutti gli esempi che ho visto si basavano su a) creando una tabella e un trigger per archiviare i dati di connessione eb) utilizzando i dati degli eventi di accesso (che contiene IsPooled) per popolare la tabella. C'è un esempio qui: http: //www.sqlservercentral.com/Forums/Topic798425-146-1.aspx#bm798660 – Brian

1

Dal lato SQL, l'unico modo valido per rivedere questo è impostare una traccia di eventi di accesso. La colonna "Sottoclasse eventi" ti dirà se l'evento si è verificato utilizzando una connessione in pool o meno. Con ciò, è possibile correlare l'host, il login e i nomi delle applicazioni e continuare a scavare.

Audit Login Event Class

Sul lato applicazione è possibile utilizzare i contatori delle prestazioni di "provider di dati .NET per SQL Server", a perfmon.

Performance Counters in ADO.NET