【问题标题】:C++/SQLite - db access with multiple processesC ++ / SQLite - 具有多个进程的数据库访问
【发布时间】:2011-09-04 23:03:47
【问题描述】:

我想在 SQLite 数据库中编写多个进程。这是我的 C++ 代码:

stringstream sstream << "BEGIN;" << query << "COMMIT;";

sqlite3_busy_timeout(databasePtr, 60000); // set timeout if sql busy

if((result = sqlite3_exec(databasePtr, (sstream.str()).c_str(), NULL, NULL, NULL)) != SQLITE_OK){
    /** ERROR or SQLITE_BUSY **/
}    

sqlite3_busy_timeout(databasePtr, 0); // reset sql_busy handler

我认为 sqlite3_busy_timeout 会导致成功。但是我检查了结果,发现并不是所有的数据都写入了数据库。我的错在哪里?

有人知道当 sqlite3_busy_timeout 设置为 60000 (ms) 时调用 sqlite3_exec 的频率吗?或者如果第一次尝试返回 SQLITE_BUSY,在 60000 (ms) 之后是否只有一次调用?

我已尝试使用以下代码解决此问题。但看起来一直只有一个活动进程。其他进程不会完成...

do{
    if((result = sqlite3_exec(databasePtr, (sstream.str()).c_str(), NULL, NULL, NULL)) != SQLITE_OK){
        if(result == SQLITE_BUSY){
            sleep(60000); // sleep 10 sec
        }else{
            /** ERROR **/
        }
    }
}while(result == SQLITE_BUSY);

【问题讨论】:

    标签: c++ sqlite process


    【解决方案1】:

    由 sqlite3_busy_timeout 安装的默认忙处理程序(src/main.c 中的 sqliteDefaultBusyCallback())休眠 1 毫秒,然后再次尝试,然后持续 2 毫秒、5 毫秒……直到总休眠时间超过您指定的超时值。

    因此,您的修复基本上复制了内部完成的工作,但是等待时间过长(sleep() 的参数以秒为单位,因此您的代码会休眠大约 18 小时)。顺便说一句,即使是 60000 毫秒 = 60 秒,对于 sqlite3_busy_timeout 中的超时来说似乎也太多了,更不用说重试之间的回退时间了。

    【讨论】:

      猜你喜欢
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2021-08-26
      • 2018-02-14
      • 2017-03-26
      • 1970-01-01
      相关资源
      最近更新 更多