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

时间:2018-07-07 15:49:40

标签: node.js sqlite node-sqlite3

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

1 个答案:

答案 0 :(得分:0)

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

WAL模式使您可以同时拥有一个作家和多个读者。其他日记模式可以让您同时拥有多个活动的读者,而没有作者,或者只有一位作家,而且在作者完成之前没有读者。因此,如果使用该数据库的其他应用程序只是读者,那么WAL可能就是您想要的。

任何试图读取或写入数据库的内容都可以写入,因此如果遇到锁定错误,它会在短暂的暂停后再次尝试,然后在几次失败的尝试后最终放弃(C api有一种方法{ {3}},不确定Node,但总是有automatically杂注。)

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

如果这仍然是一个问题,则可能需要其他数据库。

相关问题