c++ - MySQL 异常 "connection lost during query"、 "MySQL server has gone away"和 "command out of sync"

标签 c++ mysql multithreading

我有一个 C++ 代码,它使用 SQLAPI++ 库。在我的代码中,我尝试打开 mysql 连接,然后创建两个使用相同连接的命令,并从两个线程调用该命令。 在执行代码期间,我收到异常“查询期间连接丢失”和“MySQL 服务器已消失”。 有时我收到异常“命令不同步,您现在无法运行此命令”。 我尝试增加wait_timeout 150和max_allowed_pa​​ckage 64M,但我的问题没有解决。 下面你可以找到 C++ 代码。

int main()
{

  try
  {
    SAConnection saConnection;
    saConnection.Connect("scada", "root", "123qwerty!@#", SA_MySQL_Client);
    saConnection.setAutoCommit(SA_AutoCommitOff);   

    SACommand saCommand1{&saConnection, "select * from Node"};
    SACommand saCommand2{&saConnection, "select * from Node limit 1"};

    // VM: TODO: saCommand1.setOption("UseStatement") = "TRUE";
    // VM: TODO: saCommand2.setOption("UseStatement") = "TRUE";
    saCommand1.setOption("HandleResult") = "store";
    saCommand2.setOption("HandleResult") = "store";

    auto f1 = std::async(std::launch::async, [&]{ saCommand1.Execute(); saConnection.Commit(); });
    auto f2 = std::async(std::launch::async, [&]{ saCommand2.Execute(); saConnection.Commit(); });
    f1.get();
    f2.get();

    //saConnection.Commit(); // BOOM!

/*
    while (saCommand1.FetchNext())
      std::cerr << "======== fetching a record from saCommand1" << std::endl;
    while (saCommand2.FetchNext())
      std::cerr << "======== fetching a record from saCommand2" << std::endl;
*/
  }
  catch(const SAException& ex)
  {
    std::cerr << "==== ex.what() is " << static_cast<const char*>(ex.ErrText()) << std::endl;
  }

  return 0;
}

最佳答案

您正在使用来自两个 std::async 对象的一个​​连接,可能来自两个线程,这是不受支持的。创建两个到数据库的连接,每个 std::async 一个连接。

关于c++ - MySQL 异常 "connection lost during query"、 "MySQL server has gone away"和 "command out of sync",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48008789/

相关文章:

c++ - 如何正确关机?

c++ - 找到两组并集的大小?

c++ - 使用迭代器列表删除 vector 中的元素?

php - 一项记录27次

mysql - 如何使sql以自定义编码返回数据集?

c# - 为什么这个线程示例根本不可预测(每次输出不同的结果)?

c++ - 无法将元素添加到共享指针的线程安全锁定队列中

c++ - 通过 TinyXML 深度复制 XML

php - 有没有一种正确的方法可以更好地构造数组以进行循环

multithreading - XInitThreads() 的缺点是什么?