SOCI ODBC后端数据库连接池安全重连方案咨询
SOCI ODBC连接池稳定重连方案求助
我在C++程序中使用SOCI数据库库(ODBC后端),通过定时器每隔X秒检测数据库连接有效性,重连逻辑如下:
- 创建单个新连接,执行
select 1 from dual测试连通性 - 测试失败则等待下次定时器检测
- 测试成功则尝试重建连接池中的所有会话,但无论是调用
close()后再执行open(),还是使用session的reconnect()函数,都无法稳定实现——时而有效时而导致程序崩溃
相关代码片段:
try { // 用新连接测试,成功则重建连接池 soci::session sqlConnForTestFresh; sqlConnForTestFresh.open(soci::odbc, "DSN=" + dsn + ";UID=" + username + ";PWD=" + password); sqlConnForTestFresh << "select 1 from dual"; sqlConnForTestFresh.close(); cout << "Test Successfully Connection there again !" << endl; // 仅在无错误时执行,关闭并重建池内所有会话 for (int i = 0; i != EXPORT_API_DATA_DB_POOL_SIZE; i++) { soci::session& sql = connPoolOracleDb.at(i); //sql.reconnect(); // 无效 sql.close(); // 关闭后重连有时有效 sql.open(soci::odbc, "DSN=" + dsn + ";UID=" + username + ";PWD=" + password); } cout << "Reconnect to Database: Database Connection Pool Successful refreshed" << endl; } catch (odbc_soci_error const & eo) { cout << "Reconnect to ExportDatabase : Database Connect Still Failed."; } catch (exception& ex) { cout << "Reconnect to ExportDatabase : Database Connect Still Failed."; }
现寻求安全、稳定的连接池重连实现方案。
内容的提问来源于stack exchange,提问作者Sascha B
相关产品推荐
相关产品推荐

