Вставка данных в одну таблицу MySQL одновременно с помощью многопоточности в C ++ - PullRequest
0 голосов
/ 27 августа 2018

Я делаю эксперимент, который одновременно вставляет данные в таблицу 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.

ошибка cmd: INSERT INTO tb1 VALUES (1,1)

Потерянное соединение с сервером MySQL во время запроса

Ошибка сегментации

У меня следующие вопросы:

  1. Это потому, что MySQL не может одновременно принимать вставки?Или плохое использование многопоточности.
  2. При многопоточности, как указано выше, это помогает ускорить программу?Я понимаю, что лучше всего использовать несколько вставок на запрос и ЗАГРУЗИТЬ ДАННЫЕ INFILE.Но я просто хочу знать, может ли этот способ помочь.

1 Ответ

0 голосов
/ 27 августа 2018

Каждый поток должен иметь:

  • соединение с собственной базой данных
  • собственная транзакция
  • собственный курсор

Это, однако, не будетсделайте ваши вставки намного быстрее.Короче говоря, журнал innodb (журнал) по сути является последовательным, что ограничивает общую скорость вставки сервера.Читайте блог производительности mysql (percona / mariadb) для подробностей.Конечно, есть параметры для настройки, и, похоже, в последнее время были достигнуты определенные успехи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...