我有一个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选项。谢谢
答案 0 :(得分:0)
不断地打开和关闭db连接不会帮助您解决并发问题,而且效率也不高。保持打开状态。
WAL模式使您可以同时拥有一个作家和多个读者。其他日记模式可以让您同时拥有多个活动的读者,而没有作者,或者只有一位作家,而且在作者完成之前没有读者。因此,如果使用该数据库的其他应用程序只是读者,那么WAL可能就是您想要的。
任何试图读取或写入数据库的内容都可以写入,因此如果遇到锁定错误,它会在短暂的暂停后再次尝试,然后在几次失败的尝试后最终放弃(C api有一种方法{ {3}},不确定Node,但总是有automatically杂注。)
您还应该确保在执行完所有准备好的语句后将其重置或最终确定,以使它们释放锁并允许其他查询运行。
如果这仍然是一个问题,则可能需要其他数据库。