SOCI 数据库库如何使用 ODBC 后端重新连接到数据库

问题描述 投票:0回答:1

我正在使用 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.");
            }
        }
c++ database connection reconnect soci
1个回答
0
投票

我认为你的问题是

at
方法不是线程安全的。您应该使用
session
:

的构造函数访问连接池
soci::session sql(connPoolOracleDb);
sql.reconnect();
© www.soinside.com 2019 - 2024. All rights reserved.