gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:23:05 25 4
gpt4 key购买 nike

我有一个 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()

或者在进程开始时打开并让数据库对象保持打开状态?我希望减少并发错误的数量,我正在研究 WAL 选项。谢谢

最佳答案

不断地打开和关闭数据库连接不会解决并发问题,而且效率也不是很高。将其保持打开状态。

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

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

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

如果问题仍然存在,您可能需要不同的数据库。

关于node.js - SQLite3 + Node.js - 我应该为每个 INSERT 打开和关闭数据库还是保持它始终打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51224701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com