尝试批量插入行时发生Knexjs错误:超时获取连接。游泳池可能已满。

时间:2018-08-14 15:27:07

标签: node.js postgresql

完整错误:“ 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;
        }
    }

知道发生了什么吗?

谢谢

1 个答案:

答案 0 :(得分:1)

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