2011-09-14 59 views
7

我們的產品是一個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 

乾杯,
戴夫

+0

我認爲你在這裏的唯一選擇可能是更頻繁地檢查連接,但不是每次都檢查一次。也許每隔5分鐘左右? –

回答

7

那麼正式的辦法是的SQLGetConnectAttr(SQL_ATTR_CONNECTION_DEAD)的測試如果連接工作時,最後嘗試。

或SQLGetConnectAttr(conn,SQL_COPT_SS_CONNECTION_DEAD,...)測試連接是否正在工作。

+0

這真是太好了 - 一旦我測試了這個,我會標記爲答案。 – user390935

+0

嗨,尼克,更好的方法是:SQLGetConnectAttr(conn,SQL_COPT_SS_CONNECTION_DEAD,...),因爲這會測試連接是否正在工作。 SQL_ATTR_CONNECTION_DEAD僅測試上次嘗試時連接是否正常工作。儘管感謝最初的指針 - 它讓我走上了正確的軌道。乾杯,戴夫。 – user390935

+1

我認爲第二個是windows特有的,因爲在unixODBC中沒有這樣的定義,我只能找到「SQL_ATTR_CONNECTION_DEAD」。預計會是這樣(也許是一個更新的ODBC規格版本)? – a1an