我需要使用sequelize从大型数组(少数1000个对象)更新或创建mysql表中的数据。
当我运行以下代码时,它几乎占用了我的数据库服务器(vserver 2gb ram / 2cpu)的所有cpu功能,并阻塞了我的应用程序几分钟,直到完成为止。
使用sequelize有更好的方法吗?这可以在后台以某种方式完成,也可以作为批量操作,因此它不会影响我的应用程序性能?
data.forEach(function(item) {
var query = {
'itemId': item.id,
'networkId': item.networkId
};
db.model.findOne({
where: query
}).then(function(storedItem) {
try {
if(!!storedItem) {
storedItem.update(item);
} else {
db.model.create(item);
}
} catch(e) {
console.log(e);
}
});
});
答案 0 :(得分:1)
您的示例代码data.forEach()...
的第一行会对您的function(item){}
进行一连串调用。反过来,你在该函数中的代码会异常地完成一系列异步操作。
尝试使用async
包https://caolan.github.io/async/docs.htm并执行此操作
async = require('async');
...
async.mapSeries(data, function(item){...
它应该允许函数的每次迭代(在data
数组中每个项目迭代一次)在开始下一个之前完成。矛盾的是,一次做一个可能会让他们更快完成。它肯定会避免吸收你的资源。
答案 1 :(得分:1)
itemId
的MYSQL索引所以每次迭代都会查询整个表,导致高CPU负载(很明显)。