2011-09-14 18 views
7

Il nostro prodotto è un processore di transazione di ascolto TCP. Alle connessioni in entrata viene assegnato un thread per gestire la connessione e una connessione DB con cui lavorare.Modo efficiente per testare la connessione ODBC

Piuttosto che un approccio costoso per stabilire una nuova connessione DB per ogni connessione client in entrata, manteniamo un pool di connessioni al database.

Il pool di connessione al database abbastanza configurabile: min/max dimensioni, i tassi di crescita, ecc

Alcuni dettagli:

  • piattaforma è Windows 2003/2008 R2
  • DB è SQL Server 2005/2008 R2
  • metodo di collegamento è ODBC
  • linguaggio di programmazione è C++

Infine, la domanda:

Come il servizio potrebbe essere in esecuzione per diversi mesi senza un riavvio, c'è una reale possibilità che alcune delle connessioni al database nel pool diventano non validi. Voglio avere il modo più veloce possibile per testare la validità di una determinata connessione prima di assegnarla a una connessione in entrata.

Attualmente, lo faccio eseguendo la semplice istruzione SQL "SELECT 123;", tuttavia ho riscontrato che questo ha impatti negativi significativi sulle prestazioni quando vengono utilizzati piani di esecuzione paralleli.

Molto brevemente in codice, quello che sto facendo è:

// ... at some point we decide pool needs another connection... 

// Set up database connection 
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); 
SQLAllocHandle(SQL_HANDLE_DBC, env, &conn); 
SQLDriverConnect(conn, 0, in_str, in_len, out_str, DIM(out_str), &out_len, SQL_DRIVER_NOPROMPT); 

// 'conn' is placed in DB connection pool 

// ... some time later a new client connection comes in ... 

// Execute simple statement to test if 'conn' is still OK 
SQLAllocHandle(SQL_HANDLE_STMT, conn, &stmt); 
SQLExecDirect(stmt, (SQLCHAR*)"SELECT 1;", SQL_NTS); 

// If 'conn' is OK, give it to incoming connection; 
// if not, get another connection from pool 

Cheers,
Dave

+0

Penso che la tua unica opzione qui potrebbe essere quella di controllare semplicemente le connessioni più spesso, ma non tutte le volte quante volte. Forse ogni 5 minuti o giù di lì? –

risposta

7

bene il modo ufficiale è SQLGetConnectAttr (SQL_ATTR_CONNECTION_DEAD) che verifica se la connessione funzionava quando l'ultima tentata.

Oppure SQLGetConnectAttr (conn, SQL_COPT_SS_CONNECTION_DEAD, ...) che verifica se la connessione funziona correttamente.

+0

È grandioso - segnerò come risposta una volta che l'ho provato. – user390935

+0

Ciao Nick, Un modo migliore è: SQLGetConnectAttr (conn, SQL_COPT_SS_CONNECTION_DEAD, ...) poiché verifica se la connessione funziona ora. SQL_ATTR_CONNECTION_DEAD verifica solo se la connessione funzionava quando l'ultimo tentativo è stato eseguito. Grazie per il puntatore iniziale però - mi ha fatto sulla buona strada. Saluti, Dave. – user390935

+1

Penso che il secondo sia specifico per Windows dato che in unixODBC non esiste tale definizione e posso trovare solo "SQL_ATTR_CONNECTION_DEAD". È previsto che sia così (forse una versione più recente della specifica ODBC)? – a1an

Problemi correlati