Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   nodeJS и mysql (https://javascript.ru/forum/node-js-io-js/78390-nodejs-i-mysql.html)

vmetnev@mail.ru 06.09.2019 21:55

nodeJS и mysql
 
Помогите разобраться с записью данных из nodejs в mysql

Есть код, который должен записать 1 млн. строк в mysql. Расчеты занимают много времени, поэтому после каждой итерации расчетов предполагалось, что код будет записывать одну строку в mysql и переходить к другим расчетам. Также предполагалось, что после записи каждой строки в mysql, эти данные становятся доступными для запросов в mysql из других программ.

Но в рамках решения получается другая ситуация. Сначала производятся все расчеты на всех итерациях (1 млн. итераций), и только потом данные записываются в mysql.

Другими словами строки записываются в mysql не одна за одной, а всем балком по итогам всех итераций.

Как это изменить, чтобы после каждой итерации строка, отправленная в mysql записывалась в базу данных и становилась доступна для внешних запросов из базы данных пока производятся другие расчеты.

const mysql = require("mysql");

// Create connection
const db = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "somePassword",
  database: "tickers"
});

// Connect
db.connect(err => {
  if (err) {
    throw err;
  }
  console.log("MySQL connected");


  for (var uniqueSets = 0; uniqueSets < 1000000; uniqueSets++) {

    // some programming logic here

    // then calling the procedure to commit data to mysql>>>
    sendToMYSQL(
      t1,
      t2,
      t3
    );
  }


function sendToMYSQL(t1, t2, t3) {
  let post = {
    t1: t1,
    t2: t2,
    t3: t3
  };
  let sql = "INSERT INTO scope SET?";
  let query = db.query(sql, post, (err, result) => {
    if (err) throw err;
    console.log(result);
  });
}

vmetnev@mail.ru 06.09.2019 23:37

решение найдено
 
В итоге удалось найти решение. Похоже проблема исходит из настроек модуля mysql, которые как-то можно поменять, но как я не знаю. Похоже когда db.query получает строку, она отправляет её на сервер только тогда, когда процесс, который вызывает db.query, завершен. А если db.query работает в цикле, то модуль копит строки, и только после завершения самого цикла, отправляет всё на сервер. В итоге пришлось создать глобальный counter. цикл переделать в функцию. вызвать функцию один раз. А далее в самой функции, которая вызывает db.query, увеличить counter, и снова вызвать функцию, которая создана вместо цикла. Может не самое элегантное решение, да времени на выполнение занимает существенно больше, но строки записываются одна за одной и сразу становятся доступными для внешнего query. Победа!


Часовой пояс GMT +3, время: 15:29.