node.js - 尝试批量插入行时发生 Knexjs 错误:获取连接超时。游泳池可能已经满了。
问题描述
完整错误:“Knex:获取连接超时。池可能已满。您是否缺少 .transacting(trx) 调用?”
我有一个超过 70k 行的 csv / json。在 15k-17k 插入后,它停止并抛出上述错误/。代码下方:
csvtojson({
colParser: {
name: "string",
lastname: "string"
},
checkType: true
}).fromFile(csvfile)
.then(jsonArrary => {
res.json(jsonArrary[0]);
console.log(jsonArrary.length);
jsonArrary.forEach(function(array) {
knex_insert(array);
// pg_insert(array);
});
});
function knex_insert(x) {
db("tablename")
.insert({
name: null_if_empty(x["name"]),
lastname: null_if_empty(x["lastname"])
})
.then(data => {
console.log("success!");
})
.catch(err => {
console.log(err);
});
}
function null_if_empty(value) {
if (value == "") {
return null;
} else {
return value;
}
}
知道发生了什么吗?
谢谢
解决方案
当您使用 forEach 时,您正在与数据库创建成千上万的异步连接。映射数据并将所有数据放入一个插入中:
csvtojson({
colParser: {
name: "string",
lastname: "string"
},
checkType: true
})
.fromFile(csvfile)
.then((jsonArrary) => {
const insertingData = jsonArrary.map((info) => {
return {
name: null_if_empty(info["name"]),
lastname: null_if_empty(info["lastname"])
}
});
knex_insert(insertingData)
});
function knex_insert(mappedData) {
db("tablename")
.insert(mappedData)
.then(data => {
console.log("success!");
})
.catch(err => {
console.log(err);
});
}
function null_if_empty(value) {
if (value == "") {
return null;
} else {
return value;
}
}