【问题标题】:Knexjs error happens when trying to mass insert rows: Timeout acquiring a connection. The pool is probably full.尝试批量插入行时发生 Knexjs 错误:获取连接超时。游泳池可能已经满了。
【发布时间】:2018-08-14 15:27:07
【问题描述】:

完整错误:“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.js postgresql


    【解决方案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;
        }
    }
    

    【讨论】:

    • 这在插入 MySql 时是不可能的。仅适用于 Postgres
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2023-03-14
    • 2020-09-07
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多