SQL Native Client ODBC 应用程序在 SQLDisconnect 后未断开连接且未池化?

标签 sql sql-server odbc sqlncli

背景:
我正在使用一个用 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/

相关文章:

c++ - C/C++ 应用程序中嵌入式 SQL 数据库的 PostgreSQL 替代品

sql - 未使用 Postgres 索引

mysql - 提高MySQL的随机性

c# - 查找每个键具有最大值的行

sql-server - 如何在 SQL Server 中启用批量权限

sql - SQL Server 存储过程中的返回值

c# - 如何使用 C# 在 SQL Server 数据库中存储哈希值?

mysql - SQuirreL SQL 客户端是否与 QODBC 兼容?

c++ - SQL Server 的批量复制 (C API) 和 ODBC 驱动程序

c++ - Oracle 11gR1 或 R2 客户端上是否有设置可在 ODBC API 调用中将 SELECT COUNT(*) 返回的数据类型从 DOUBLE 更改为 LONG?