SQLite3 + Node.js - 我应该为每个插入打开和关闭数据库还是使其始终保持打开状态?



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

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 模式允许您同时拥有一个写入器和多个读取器。其他日志模式允许您同时拥有多个活动读取器,没有编写器,或者一个编写器而没有读取器,直到编写器完成。因此,如果使用数据库的其他应用程序只是一个读取器,那么 WAL 可能是您想要的。

任何尝试读取或写入数据库的东西都可以写入,因此如果它出现锁定错误,它会在短暂暂停后再次尝试,然后在几次失败的尝试后最终放弃(C api 有一种方法可以自动执行此操作,不确定 Node,但总有busy_timeout编译指示(。

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

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

最新更新