c++ - C++多线程并发向单个MySQL表插入数据

标签 c++ mysql database multithreading

我正在做一个实验,通过多线程并发向MySQL表中插入数据。

这是 C++ 的部分代码。

    bool query_thread(const char* cmd, MYSQL* con) {
      if( !query( cmd, con ) ) {
        return 0;
      }
      return 1;
    }
    int main() {
          ........
      if(mysql_query(m_con, "CREATE TABLE tb1 (model INT(32), handle INT(32))") != 0) {
        return 0;
      }
        
      thread thread1(query_thread, "INSERT INTO tb1 VALUES (1,1)", m_con);
      thread thread2(query_thread, "INSERT INTO tb1 VALUES (2,2)", m_con);
      thread thread3(query_thread, "INSERT INTO tb1 VALUES (3,3)", m_con);
      thread1.join();
      thread2.join();
      thread3.join();
    }

但是发出MySQL错误消息。

error cmd: INSERT INTO tb1 VALUES (1,1)

Lost connection to MySQL server during query

Segmentation fault

我的问题如下。

  1. 是不是因为MySQL不能接受并发插入?或者多线程使用不当。
  2. 通过上面的多线程插入,是否有助于加快程序速度?我知道最好的方法是每个查询多次插入和加载数据INFILE。但我只是想知道这种方式是否有帮助。

最佳答案

每个线程必须具有:

  • 自己的数据库连接
  • 自己的交易
  • 自己的光标

但是,这不会使您的插入速度更快。简而言之,innodb日志(journal)本质上是串行的,这限制了服务器总插入率。阅读 mysql 性能博客 (percona/mariadb) 了解详细信息。当然,还有一些参数需要调整,而且最近似乎已经取得了进展。

关于c++ - C++多线程并发向单个MySQL表插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52031568/

相关文章:

c++ - 将文件中的数字读入数组

c++ - 在数组大小中使用位操作的原因

c# - 使用 Entity Framework 防止插入对类别表的重复引用

java - Wicket7 : Internationalization and Database-Access

mysql - 生成庞大的未知数据库的一般架构

database - 分离成只读/只写数据库

c# - 如何在 VS 2013 中调试 Windows Phone (8) 运行时组件或 C++ DLL 中的 C++ 代码

c++ boost序列化如何防止不正确的文件崩溃

mysql - 动态创建表的数据库设计

php - 在 yii2 中使用限制范围?