首页 > 解决方案 > 尝试批量插入行时发生 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;
        }
    }

知道发生了什么吗?

谢谢

标签: node.jspostgresql

解决方案


当您使用 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;
    }
}

推荐阅读