Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 测试ODBC连接的有效方法_C++_Sql Server_Database_Odbc - Fatal编程技术网

C++ 测试ODBC连接的有效方法

C++ 测试ODBC连接的有效方法,c++,sql-server,database,odbc,C++,Sql Server,Database,Odbc,我们的产品是TCP侦听事务处理器。传入连接分配了一个线程来处理连接,并分配了一个DB连接来处理 我们维护一个数据库连接池,而不是为每个传入的客户端连接建立新的DB连接的昂贵方法 数据库连接池相当可配置:最小/最大大小、增长率等 一些细节: 平台是Windows 2003/2008 R2 DB是SQL Server 2005/2008 R2 连接方法是ODBC 程序设计语言是C++ 最后,问题是: 由于该服务可以在不重新启动的情况下运行数月,因此池中的某些数据库连接很可能会失效。在将给定连接

我们的产品是TCP侦听事务处理器。传入连接分配了一个线程来处理连接,并分配了一个DB连接来处理

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

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

一些细节:

  • 平台是Windows 2003/2008 R2
  • DB是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
干杯,

Dave

官方的方法是SQLGetConnectAttr(SQL\u ATTR\u CONNECTION\u DEAD),它测试上次尝试连接时连接是否工作


或者SQLGetConnectAttr(conn,SQL\u COPT\u SS\u CONNECTION\u DEAD,…),用于测试连接是否正在工作。

我认为您在这里的唯一选择可能是更频繁地检查连接,但不是像每次那样频繁。也许每5分钟左右一次?你好,尼克,更好的方法是:SQLGetConnectAttr(conn,SQL\u COPT\u SS\u CONNECTION\u DEAD,…),因为这会测试连接现在是否工作。SQL\u ATTR\u CONNECTION\u DEAD仅测试上次尝试时连接是否工作。不过还是要感谢你最初的指点——它让我走上了正确的轨道。干杯,戴夫。我认为第二个是特定于windows的,因为在unixODBC中没有这样的定义,我只能找到“SQL属性连接死了”。是否希望如此(可能是更新的ODBC规范版本)?@a1an它是特定于MS SQL Server驱动程序的