我們的產品是一個TCP偵聽事務處理器。傳入連接被分配一個線程來處理連接和數據庫連接。測試ODBC連接的有效方法
我們維護一個數據庫連接池,而不是爲每個傳入客戶端連接建立新數據庫連接的代價昂貴的方法。
數據庫連接池相當配置:最小/最大規模,增長速度等
一些細節:
- 平臺是Windows 2003中/ 2008 R2
- 數據庫是SQL Server 2005中/ 2008 R2
- 連接方法是ODBC
- 編程語言爲C++
最後,問題:
由於服務可以不重新啓動運行了幾個月,有一個真正的機會,一些在池數據庫的連接變得無效。我希望儘可能快地測試給定連接的有效性,然後將其分配給傳入連接。
目前,我通過執行簡單的SQL語句「SELECT 123;」來做到這一點,但是我發現這在使用並行執行計劃時會對性能產生顯着的負面影響。
非常簡單的代碼,我在做什麼是:
// ... 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
乾杯,
戴夫
我認爲你在這裏的唯一選擇可能是更頻繁地檢查連接,但不是每次都檢查一次。也許每隔5分鐘左右? –