我正在使用 SOCI 数据库库。我在我的 C++ 程序中有一个计时器,它使用 SOCI 中的 ODBC 后端每 x 秒检查一次与数据库的连接是否仍在工作。 如果程序检测到连接断开(testquery 不起作用),我想尝试重新连接到数据库,这是通过以下工作流程完成的:
1.) 尝试创建到数据库的单个连接并从双 sql 语句中触发 Select 1。
2.) 不成功则不执行任何操作,直到计时器中发生下一次检查。
2.1)如果成功,我尝试将所有会话重新连接到连接池中的数据库,但这并不安全,有时它可以工作,有时它会使我的程序崩溃,无论我尝试使用 close() 然后 open(connstring) 或使用会话上的 reconnect() 函数。
请参阅代码片段。
希望有人可以帮助我如何做/实施一种安全的方法来存档此内容。
谢谢和问候
萨沙
try
{
// Test with Fresh Connection if Connect successfuly reinit Pool
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;
// This will be only executed if no error occoured before
// now close all Sessions in the Pool
for (int i = 0; i != EXPORT_API_DATA_DB_POOL_SIZE; i++)
{
soci::session& sql = connPoolOracleDb.at(i);
//sql.reconnect(); // <-- This will not work
sql.close(); // <-- Close and then reopen works sometimes
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.");
}
}