2008-12-22 34 views
1

背景:
我正在使用C++編寫的程序,該程序在SQL Native Client上使用ODBC建立與SQL Server 2000數據庫交互的連接。SQL本機客戶端ODBC應用程序在SQLDisconnect和不共享後不斷開連接?

問題:
我的連接被抽象成其打開時該對象被實例化的連接,並且當所述對象被銷燬關閉連接的對象。我可以看到對象正在被銷燬:它們的析構函數正在被觸發,在這些析構函數內部SQLDisconnect(ConnHandle)被調用,然後是SQLFreeHandle(SQL_HANDLE_DBC, ConnHandle);然而,使用sp_Who2或SQL中的性能監視器來觀察連接數顯示連接數量不增加,儘管這些連接被破壞。

直到執行足夠長的功能鏈才能創建幾千個這樣的對象,並且因此可以連接數千個連接,這個問題還沒有被證明是有問題的。

問題:
有沒有人見過這樣的事情?什麼可能導致這種情況?我最初的谷歌搜索沒有證明非常有成果!

編輯:
我已驗證SQLDisconnect沒有錯誤返回。

連接池已關閉。實際上,當我嘗試使用SQLSetEnvAttr啓用它時,我的應用程序在第二次調用SQLDriverConnect時崩潰。

回答

2

檢查您沒有使用連接池。如果它打開,它會緩存一些(可配置)時間的打開的連接。

如果您沒有使用連接池,那麼您必須檢查SQLDisconnect()的返回值。您可能有一些事務正在執行或回滾,不會讓SQL Disconnect()釋放您的連接。

有關於如何檢查SQLDisconnect錯誤的更多詳細信息,請參閱MSDN

+0

謝謝你的迴應。我已經爲我的問題添加了一個編輯來解決您的問題。 – antik 2008-12-23 00:02:30

1

我相信我在使用MFC和ODBC的應用程序中看到了相同的問題,而不是直接使用SQL本機客戶端API。 Occaisonally我的應用程序掛在關機時,堆棧跟蹤是:

 
sqlncli!CCriticalSectionNT::Enter 
sqlncli!SQLFreeStmt 
sqlncli!SQLFreeConnect 
sqlncli!SQLFreeHandle 
odbc32!UnloadDriver 
odbc32!FreeDbc 
odbc32!DestroyIDbc 
odbc32!FreeIdbc 
odbc32!SQLFreeConnect 
mfc42!CDatabase::Close 
mfc42!CDatabase::Free 
mfc42!CDatabase::~CDatabase 

嘗試,因爲我可能,我看不到任何可能導致出現這種掛起。如果有人能提出解決方案,我將不勝感激。看起來其他人已經在網上看到類似的問題,但迄今爲止我還沒有找到任何解決方案。

1
 
    sqlncli!CCriticalSectionNT::Enter 
    sqlncli!SQLFreeStmt 
    sqlncli!SQLFreeConnect 
    sqlncli!SQLFreeHandle 
    odbc32!UnloadDriver 
    odbc32!FreeDbc 
    odbc32!DestroyIDbc 
    odbc32!FreeIdbc 
    odbc32!SQLFreeConnect 
    mfc42!CDatabase::Close 
    mfc42!CDatabase::Free 
    mfc42!CDatabase::~CDatabase 

從不具有底部的堆棧跟蹤,我們可以假設的CDatabase是一個全局變量? 可能在一個DLL?

如果嘗試從全局變量的析構函數中斷開與SQL Server的連接,我們發現了您的確切症狀。

使用MDAC ODBC驅動程序可以成功運行。 將代碼移出析構函數可以成功運行。

這似乎與SQL本地客戶端不喜歡被從DllMain內部調用。

相關問題