2013-02-22 13 views
6

Abbiamo un'applicazione a tre livelli con un client C#, un livello di servizio Web WCF C# e un database SQL Server. Il servizio Web si collega al database con ADO.NET. Tutto il nostro codice C# utilizza .NET Framework 2.0.Monitoraggio della connessione ADO.NET Tempo aperto

Recentemente, un cliente ha eseguito uno stress test sulla nostra applicazione. Durante il test, il server Web ha generato numerosi errori come il seguente:

Impossibile connettersi al database per la stringa di connessione '...'. Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell'operazione o il server non risponde.

Sono consapevole che esistono modi per rilevare gli errori di connessione quando il pool di connessioni è pieno e provare ad acquisire una connessione al di fuori del pool di connessioni. Abbiamo anche trovato diverse query che dovevano essere ottimizzate, ma non precisano i timeout della connessione al server web.

Stiamo cercando di capire il motivo per cui il server Web ha interrotto il collegamento al database. Ho installato il web server per abilitare tutti i ADO.NET performance counters. Tuttavia, non vedo nulla relativo ai tempi necessari per connettersi o timeout di connessione o simili. Idealmente, saremo in grado di rappresentare graficamente i tempi di connessione in perfmon accanto agli altri contatori ADO.NET.

C'è un modo per monitorare le prestazioni di ADO.NET nell'acquisizione delle connessioni?

Immagino che potremmo creare il nostro contatore di prestazioni "tempo medio di apertura della connessione" temporizzando i tentativi di aprire le connessioni, ma preferirei usare qualcosa che esiste già.

+0

SQL Profiler potrebbe aiutare in questo senso? –

+0

@MrMoose: il profiler ha aiutato molto nella ricerca di alcune domande problematiche. Ma ho bisogno di qualcosa di specifico per monitorare i tempi di connessione per vedere quando salgono e quando iniziano a scadere. –

risposta

2

È possibile utilizzare perfmon per ottenere queste informazioni. Dovrai collegarti al monitor User Connections sotto SQL Server: General Statistics. Here is the blog post L'ho afferrato da. Questo ti permetterà di sapere a che ora le connessioni vengono lasciate aperte.

Sarà quindi necessario correlarlo con le attività dell'applicazione (vale a dire roba che si sta facendo nell'applicazione quando le vedi salire continuamente).

Una volta fatto che si sta andando a voler ottenere quei collegamenti all'interno una dichiarazione using se non già:

using (SqlConnection cn = new SqlConnection("some connection string")) 
{ 
    cn.Open(); 
    ... 
} 

in questo modo non sarà necessario emettere un Close e non dovrai preoccuparti che vengano smaltiti correttamente.

In breve, il contatore delle prestazioni dovrebbe aiutarti a rintracciare il codice nell'applicazione che sta causando il problema, ma non sarà verso la linea per dire, ci vorrà un po 'più sforzo anche da lì.

+0

Grazie, ma non sono preoccupato per la connessione dell'applicazione diposal. Sono abbastanza sicuro che il nostro oggetto dati lo stia facendo correttamente. Mi chiedo perché ogni tanto ci vuole molto tempo per connettersi al database. In particolare, mi piacerebbe monitorare il tempo di acquisizione di una connessione tramite perfmon in modo da poter confrontare i picchi nei tempi di acquisizione della connessione con alcuni tipi di database come l'I/O in sospeso o l'utilizzo della CPU o simili. Non vedo nessun altro modo per farlo se non quello di creare il mio contatore personale. –

Problemi correlati