SQLite3 + Node.js - 我应该为每个 INSERT 打开和关闭数据库还是让它始终打开?

SQLite3 + Node.js - Should I open and close the database for each INSERT or keep it always open?

我有一个 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 选项。谢谢

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

WAL 模式允许您同时拥有一个写入器和多个 reader。其他日志模式允许您同时拥有多个活动的 readers 而没有作者,或者只有一个作者并且在作者完成之前没有 readers。所以如果使用数据库的其他应用程序只是一个 reader,WAL 可能就是你想要的。

任何试图读取或写入数据库的东西都可以被写入,所以如果它遇到锁定错误,它会在短暂的暂停后再次尝试,然后在几次失败的尝试后最终放弃(C api 有一种方法 automatically, not sure about Node, but there's always the busy_timeout pragma).

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

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