#mysql #node.js #asynchronous
Вопрос:
Хорошо, нужна помощь.
Есть приложение на узле js и mysql. Я не совсем понимаю поведение связей.
Вот мой код (его часть).
let connection = mysql.createConnection({
host: "localhost",
database: "mans",
user: 'root',
password: '',
}).promise();
let results = [
// array of objects
];
await Promise.all(
results.map(r=>{
return connection.query("UPDATE `table` SET `name` = ?, WHERE `id` = ?", [r.name, r.id]).then(r=>{
console.log('end iteration');
}).catch(err=>{
console.log('err: ', err);
});
})
)
Теперь, когда map
функция запускается (конечно, aync, как ожидается), она query
работает как простая функция синхронизации! Ну, может быть, это потому, что я не использую пулы. Поэтому я переписываю его заново.
let pool = mysql.createPool({
connectionLimit: 100,
host: "localhost",
database: "mans",
user: 'root',
password: '',
}).promise();
let results = [
// array of objects
];
await Promise.all(
results.map(r=>{
return pool.getConnection().then(connection=>{
console.log('opened connection');
return connection.query("UPDATE `table` SET `name` = ?, WHERE `id` = ?", [r.name, r.id]).then(r=>{
connection.release();
console.log('end iteration');
return;
}).catch(err=>{
console.log('err: ', err);
});
}).catch(err=>{
console.log('err: ', err);
});
})
)
Событие открытия соединения сработало асинхронно и успешно, но обновления все еще ждут друг друга. Что я делаю не так?
Комментарии:
1. Ладно, кое-какие новости. Пробовал использовать
START TRANSACTION
иCOMMIT
команды. И на моем локальном сервере Windows это работает, все операции идут асинхронно. Без этого все было синхронно. Но он не работал на сервере с Ubuntu 18.04 и mysql 5.7. Операции все еще синхронизировались. Обновление за обновлением. Проверил двигатель, он былInnoDB
Ответ №1:
Наконец-то я получил какой-то результат. Но для меня это не имеет никакого смысла. Если кто-нибудь может это прояснить, пожалуйста, сделайте это.
Моя проблема решена с помощью добавления INDEX
в ID
поле (было без него) в WHERE
заявлении. С START TRANSACTION
функциями и функциями он начал работать синхронно. COMMIT
Опять же, без него или без индекса по идентификатору, обновление работало синхронизировано — только когда заканчивался предыдущий.
Комментарии:
1. Возможно, он не меняется на асинхронный, но теперь обновление происходит так быстро, что вы не можете заметить разницу.
2. Ладно, ты прав. Я сделал еще один тест, и да, он был быстрым, но все равно один за другим. Но тогда мой вопрос все еще открыт, почему он не работает так синхронно, как я хочу?