mysql - 优化更新查询功能,使用异步更新超过 1000 条记录
问题描述
我有一个功能可以根据特定条件更新 1000 多条记录。但是当我运行这个函数时,我得到Too many connection
了错误,因为只有一半的记录得到更新。如何使用 async 使此功能运行?它应该一口气更新所有记录
代码:
db.query("select *, date(login) as login_date from userRegister where logout IS NULL limit 10", function (err, user) {
if (!_.size(user))
return
var byCatId = _.groupBy(user, 'catId');
var grouppedArray = _.map(byCatId, function(array) {
return _.groupBy(array, 'login_date')
});
var i, j, k
for (i in grouppedArray) {
if (grouppedArray.hasOwnProperty(i)) {
for (j in grouppedArray[i]) {
if (grouppedArray[i].hasOwnProperty(j)) {
if (grouppedArray[i][j].length > 1) {
for(var k=0;k<grouppedArray[i][j].length;k++){
if(grouppedArray[i][j][k+1]){
var updatedLogOut = moment(grouppedArray[i][j][k+1].login).subtract(1, 'minutes').format('YYYY-MM-DD HH:mm:ss')
async.eachSeries(db.query('update userRegister set logout= ? where userId = ? and catId = ?', [updatedLogOut, 1, grouppedArray[i][j][k].userId, grouppedArray[i][j][k].catId], function (err, updatedLogout) {
if (err) {
console.log(err)
return err
}
if (!_.size(updatedLogout))
return
console.log("Updated Successfully")
return updatedLogout
})
}
}
}
}
}
}
}
})
解决方案
根据文档,第一个参数是可迭代对象。您可以传递所有必须作为第一个参数更新的查询数组以及在执行时处理每个项目的函数。
更新代码,未经测试。
var queries = []
var i, j, k
for (i in grouppedArray) {
if (grouppedArray.hasOwnProperty(i)) {
for (j in grouppedArray[i]) {
if (grouppedArray[i].hasOwnProperty(j)) {
if (grouppedArray[i][j].length > 1) {
for (var k = 0; k < grouppedArray[i][j].length; k++) {
if (grouppedArray[i][j][k + 1]) {
var updatedLogOut = moment(grouppedArray[i][j][k + 1].login).subtract(1, 'minutes').format('YYYY-MM-DD HH:mm:ss')
queries.push([updatedLogOut, 1, grouppedArray[i][j][k].userId, grouppedArray[i][j][k].catId])
}
}
}
}
}
}
}
async.eachSeries(queries,
function(item, done){
db.query('update userRegister set logout= ? where userId = ? and catId = ?', item , function (err, updatedLogout) {
done(err)
})
})
希望它会有所帮助
推荐阅读
- html - 卡片覆盖仅在图像上滑入?
- geotools - 边界框中没有 CRS 的 GeoTools getCapabilities
- python - 识别两个标题之间的差异(为错误值着色)
- windows - 为什么 UiPath 检测到的 ctrlid 格式与其 XSLT 表示形式中记录的格式不同?
- php - 检查数组中的下一个值,如果匹配,则删除下一项(PHP)
- python - 用于安装 PyPi 的 Helm 图表?
- gitlab-omnibus - 如何在 GitPitch 中关闭 SSL 验证?
- java - 以编程方式为所有 java.util.logging 记录器设置级别
- c - STM32F411VET6 将数据存储在 R/W 闪存中
- combobox - 当我第一次在作为堆栈面板的子项添加的网格中以编程方式定义的组合框中选择一个项目时,应用程序崩溃