【问题标题】:SQlite3 and knexjs results in Timeout acquiring a connectionSQlite3 和 knexjs 导致超时获取连接
【发布时间】:2019-05-12 08:18:06
【问题描述】:

我正在尝试运行以下代码并收到错误

{ TimeoutError: Knex: 获取连接超时。游泳池是 大概满了。您是否缺少 .transacting(trx) 调用?

有没有办法让 sqlite 等到池为空?如果没有,你有什么建议?

const path = require('path');

const knex = require('knex')({
    client: 'sqlite3',
    useNullAsDefault: true,
    connection: {
        filename: path.join(__dirname, '/db/sqlite.db')
    }
});


knex('lorem')
        .insert({ rowid: 'Slaughterhouse Five' })

var z = 0;
while (z < 20000) {
    knex('lorem')
        .select('rowid')
        .then(result => {
            console.log('res', result);
        })
        .catch(error => console.log('Error in select', error));
    z++;
}

【问题讨论】:

    标签: sqlite knex.js


    【解决方案1】:

    我建议不要尝试运行 20000 个并行查询。您希望在什么时候等待池为空?您可以一个一个地运行所有查询,也可以使用 Bluebird 的 .map(),它允许传递并发参数来限制同时解决多少个查询。

    【讨论】:

    • 假设要在数据库中插入 20000 条记录,您能否告诉我如何更改上述代码并使其逐个运行(正如您在帖子中提到的那样)?
    • 因为这可能是最容易使用的knex.batchInsert('TableName', anArrayOfRows).then(res =&gt; console.log(res))
    • 好的,我已经切换到 Sequelize,它可以优雅地处理这种情况。 docs.sequelizejs.com
    • 祝你好运。是的,sequelize 是完全不同级别的数据库工具。它在下面做了各种各样的魔法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2017-02-20
    • 2018-12-29
    • 2020-11-04
    • 1970-01-01
    • 2011-12-05
    • 2022-01-18
    相关资源
    最近更新 更多