为什么我得到node-sqlite3 SQLITE_BUSY

Vor*_*t3x 3 sqlite node.js

网络服务器在将数据定期存储在node-sqlite3驱动的数据库中时出现问题。它会工作几次,然后失败

SQLITE_BUSY:数据库已锁定

有时即使没有失败,所有插入操作也都没有完成到数据库中,只在表中保留了一部分插入操作。

setInterval(doInserts,60000);

doInserts() {
calculateData(function(data){
    if(data)
    {
        insertData(data);
    }
});
}

function insertData(data) {
var sqlite3 = require("sqlite3").verbose();

//user fs existSync to check if file exists and openSync(file,'w') to create if not

db.serialize(function(){
    var stmt = db.prepare("INSERT INTO mytable (col1,col2) values (?,?)");

    for(var i =0;i<data.length;i++)
        stmt.run(data[0],data[1]);
    stmt.finalize();
});
db.close();
}
Run Code Online (Sandbox Code Playgroud)

考虑到我对节点和SQLite都是陌生的,我猜测我以错误的方式使用了某些东西,导致多个开放线程或进程锁定了db,但是没有任何文档或研究使我更接近解决方案。

小智 6

只是为我解决了什么。每当我有一个数据查看器应用程序查看数据库时,就会发生这种情况。一旦关闭,它又开始工作了!


Mat*_*lla 3

我怀疑你正确理解 Node\Sqlite。我使用 Sqlite3#serialize 遇到了同样的问题。我最终没有使用它,而是使用了Mixu 的 Node Book 7.2.2 章节中的模式。 控制数据库查询的流程。基本上你有一系列的功能。每个函数都有一个调用下一​​个函数的回调。