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
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ì? –