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);
});
}
|
решение найдено
В итоге удалось найти решение. Похоже проблема исходит из настроек модуля mysql, которые как-то можно поменять, но как я не знаю. Похоже когда db.query получает строку, она отправляет её на сервер только тогда, когда процесс, который вызывает db.query, завершен. А если db.query работает в цикле, то модуль копит строки, и только после завершения самого цикла, отправляет всё на сервер. В итоге пришлось создать глобальный counter. цикл переделать в функцию. вызвать функцию один раз. А далее в самой функции, которая вызывает db.query, увеличить counter, и снова вызвать функцию, которая создана вместо цикла. Может не самое элегантное решение, да времени на выполнение занимает существенно больше, но строки записываются одна за одной и сразу становятся доступными для внешнего query. Победа!
|
| Часовой пояс GMT +3, время: 19:21. |