3

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

4

1 回答 1

2

不断打开和关闭数据库连接不会帮助您解决并发问题并且效率不高。让它打开。

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

任何试图读取或写入数据库的东西都可以被写入,所以如果它遇到锁定错误,它会在短暂的暂停后再次尝试,然后在几次尝试失败后最终放弃(C api 有一种自动执行此操作的方法,不确定关于 Node,但总是有busy_timeout 杂注)。

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

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

于 2018-07-07T18:51:57.053 回答