为什么我得到node-sqlite3 SQLITE_BUSY

时间:2014-02-27 06:32:24

标签: node.js sqlite

我遇到了一个webserver的问题,它定期在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();
}

考虑到我是节点和SQLite的新手,我猜我正在以错误的方式使用某些东西,导致多个开放线程或进程锁定数据库,但没有任何文档或研究让我更接近解决方案。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

循环中的查询 - 根本就是坏主意。 请改用https://github.com/mapbox/node-sqlite3/wiki/API#databaseexecsql-callback

SQLITE_BUSY: database is locked

当数据库已被其他程序打开时,我会发出此消息。

答案 3 :(得分:0)

SQLite数据库一次只能处理1个事务。因此,如果您有多个并发请求到您的数据库,有时您将锁定数据库。

SQLite有一些非常简单的机制让事务等到另一个事务正在进行,但这还不够。

我以类似的方式解决了同样的问题,正如@MattShirilla建议的那样。您需要使用队列或控制流来确保锁定。