测试ODBC连接的有效方法

use*_*935 9 c++ database sql-server odbc

我们的产品是TCP侦听事务处理器.为传入连接分配一个线程来处理连接和一个要使用的DB连接.

我们维护一个数据库连接池,而不是为每个传入的客户端连接建立新的数据库连接的昂贵方法.

数据库连接池可配置:最小/最大大小,增长率等.

一些细节:

  • 平台是Windows 2003/2008 R2
  • DB是SQL Server 2005/2008 R2
  • 连接方法是ODBC
  • 编程语言是C++

最后,问题是:

由于服务可能会在没有重新启动的情况下运行几个月,因此池中的某些数据库连接很可能无效.我想尽可能快地测试给定连接的有效性,然后再将其分配给传入连接.

目前,我通过执行简单的SQL语句做到这一点"选择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
Run Code Online (Sandbox Code Playgroud)

干杯,
戴夫

小智 9

那么官方的方法是SQLGetConnectAttr(SQL_ATTR_CONNECTION_DEAD),它测试上次尝试时连接是否正常工作.

或SQLGetConnectAttr(conn,SQL_COPT_SS_CONNECTION_DEAD,...),它测试连接现在是否正常工作.

  • 我认为第二个是特定于Windows的,因为在unixODBC中没有这样的定义,我只能找到"SQL_ATTR_CONNECTION_DEAD".是期望这样(可能是更新的ODBC规范版本)? (2认同)