【问题标题】:Why am I getting node-sqlite3 SQLITE_BUSY为什么我得到 node-sqlite3 SQLITE_BUSY
【发布时间】:2017-08-11 14:36:17
【问题描述】:

我在使用 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();
}

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

【问题讨论】:

    标签: node.js sqlite


    【解决方案1】:

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

    【讨论】:

    • 我很生气,但这也为我解决了问题。哈哈
    • 看起来很傻,这很可能是解决这种烦人问题的方法。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      SQLite 数据库一次只需 1 个事务即可正常工作。因此,如果您对数据库有多个并发请求,有时您会锁定数据库。

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

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

      【讨论】:

        【解决方案4】:

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

        SQLITE_BUSY: database is locked
        

        当数据库已经被另一个程序打开时,我会给出这个消息。

        【讨论】:

          猜你喜欢
          • 2021-07-06
          • 1970-01-01
          • 2018-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-09
          • 2021-11-18
          • 2019-12-27
          相关资源
          最近更新 更多