gpt4 book ai didi

c++ - 测试 ODBC 连接的有效方法

转载 作者:可可西里 更新时间:2023-11-01 16:37:50 30 4
gpt4 key购买 nike

我们的产品是一个 TCP 监听事务处理器。传入连接被分配一个线程来处理连接和一个数据库连接来处理。

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

数据库连接池相当可配置:最小/最大大小、增长率等。

一些细节:

  • 平台为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++ - 测试 ODBC 连接的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7424298/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com