【问题标题】:SQLite3 + Node.js - Should I open and close the database for each INSERT or keep it always open?SQLite3 + Node.js - 我应该为每个 INSERT 打开和关闭数据库还是让它始终打开?
【发布时间】:2018-07-08 02:51:57
【问题描述】:

我有一个 Node.js 进程监控应用程序,当某个动作发生时写入数据库。此数据库有一个前端,当两者都尝试访问数据时会导致并发错误。内部过程并不重要,但是每秒大约有 3 次写入数据库(我认为这仍然很慢)。这是我的 INSERT 语句:

db.run(query, data, function(e)
{
    if (e)
    {
        console.log("Could not insert a Sync!")
        console.log(e.message)
    }
});

我的问题是,我是否应该为每次插入打开和关闭数据库:

db = new sql.Database('../db', sql.OPEN_READWRITE, (e) =>
{
    if (e)
    {
        console.log("Could not connect to the DB!")
        console.log(e.message)
    }
})

db.run(query, data, function(e)
{
    if (e)
    {
        console.log("Could not insert a Sync!")
        console.log(e.message)
    }
});

db.close()

或者在进程开始时打开并让 db 对象保持打开状态? 我希望减少并发错误的数量,我正在研究 WAL 选项。谢谢

【问题讨论】:

    标签: node.js sqlite node-sqlite3


    【解决方案1】:

    不断打开和关闭数据库连接不会帮助您解决并发问题,而且效率不高。保持打开状态。

    WAL 模式可让您同时拥有一个写入器和多个读取器。其他日志模式允许您同时拥有多个活跃的读者,没有作者,或者只有一个作者,没有读者,直到作者完成。因此,如果使用数据库的其他应用程序只是一个阅读器,那么 WAL 可能就是您想要的。

    任何试图读取或写入数据库的东西都可以被写入,所以如果它遇到锁定错误,它会在短暂的暂停后再次尝试,然后在几次尝试失败后最终放弃(C api 有办法做到这一点@ 987654321@,不确定 Node,但总是有 busy_timeout 杂注)。

    您还应该确保您执行的任何准备好的语句在完成后都被重置或完成,以便它们释放锁并允许其他查询运行。

    如果仍然存在问题,您可能需要一个不同的数据库。

    【讨论】:

      猜你喜欢
      • 2011-09-14
      • 1970-01-01
      • 2020-04-15
      • 2011-06-19
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 2012-12-04
      相关资源
      最近更新 更多