测试ODBC连接的有效方法
Efficient way to test ODBC connection
我们的产品是一个TCP侦听事务处理器。传入的连接被分配一个线程来处理连接和一个DB连接。
我们维护一个数据库连接池,而不是为每个传入的客户端连接建立新的数据库连接。
数据库连接池相当可配置:最小/最大大小,增长率等
一些细节:
- 平台为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
欢呼,
戴夫
官方的方法是SQLGetConnectAttr(SQL_ATTR_CONNECTION_DEAD),它测试连接在最后一次尝试时是否工作。
或SQLGetConnectAttr(conn, SQL_COPT_SS_CONNECTION_DEAD,…),用于测试连接现在是否正常。
相关文章:
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法