背景:
我正在使用一个用 C++ 编写的程序,该程序使用 SQL Native Client 上的 ODBC 建立连接以与 SQL Server 2000 数据库进行交互。
问题:
我的连接被抽象为一个对象,该对象在实例化对象时打开连接,并在对象被销毁时关闭连接。我可以看到对象正在被销毁:它们的析构函数正在触发,并且在这些析构函数内部,SQLDisconnect( ConnHandle )
正在被调用,然后是 SQLFreeHandle( SQL_HANDLE_DBC, ConnHandle );
但是,使用 sp_Who2
观察连接计数或者 SQL 中的性能监视器显示连接计数不断增加,尽管这些连接已被破坏。
在执行运行足够长的函数链以创建数千个此类对象以及数千个连接之前,这并没有被证明是有问题的。
问题:
以前有人见过这样的事情吗?可能是什么原因造成的?我最初的谷歌搜索并没有得到很好的结果!
编辑:
我已验证SQLDisconnect
返回没有错误。
连接池已关闭。事实上,当我尝试使用 SQLSetEnvAttr
启用它时,当第二次调用 SQLDriverConnect
时,我的应用程序崩溃了已制作完毕。
最佳答案
检查您是否没有使用连接池。如果打开,它将缓存打开的连接一段时间(可配置)。
如果您没有使用连接池,则必须检查 SQLDisconnect() 的返回值。您可能正在执行某些事务或回滚,这不会让 SQL Disconnect() 释放您的连接。
有关如何检查 SQLDisconnect 错误的更多详细信息,请访问 MSDN .
关于SQL Native Client ODBC 应用程序在 SQLDisconnect 后未断开连接且未池化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/387525/