SQL本机客户端ODBC应用程序在SQLDisconnect和不共享后不断开连接?

问题描述:

背景:
我正在使用C++编写的程序,该程序在SQL Native Client上使用ODBC建立与SQL Server 2000数据库交互的连接。SQL本机客户端ODBC应用程序在SQLDisconnect和不共享后不断开连接?

问题:
我的连接被抽象成其打开时该对象被实例化的连接,并且当所述对象被销毁关闭连接的对象。我可以看到对象正在被销毁:它们的析构函数正在被触发,在这些析构函数内部SQLDisconnect(ConnHandle)被调用,然后是SQLFreeHandle(SQL_HANDLE_DBC, ConnHandle);然而,使用sp_Who2或SQL中的性能监视器来观察连接数显示连接数量不增加,尽管这些连接被破坏。

直到执行足够长的功能链才能创建几千个这样的对象,并且因此可以连接数千个连接,这个问题还没有被证明是有问题的。

问题:
有没有人见过这样的事情?什么可能导致这种情况?我最初的谷歌搜索没有证明非常有成果!

编辑:
我已验证SQLDisconnect没有错误返回。

连接池已关闭。实际上,当我尝试使用SQLSetEnvAttr启用它时,我的应用程序在第二次调用SQLDriverConnect时崩溃。

检查您没有使用连接池。如果它打开,它会缓存一些(可配置)时间的打开的连接。

如果您没有使用连接池,那么您必须检查SQLDisconnect()的返回值。您可能有一些事务正在执行或回滚,不会让SQL Disconnect()释放您的连接。

有关于如何检查SQLDisconnect错误的更多详细信息,请参阅MSDN

+0

谢谢你的回应。我已经为我的问题添加了一个编辑来解决您的问题。 – antik 2008-12-23 00:02:30

我相信我在使用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 

尝试,因为我可能,我看不到任何可能导致出现这种挂起。如果有人能提出解决方案,我将不胜感激。看起来其他人已经在网上看到类似的问题,但迄今为止我还没有找到任何解决方案。

 
    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内部调用。