C / SQLite – 具有多个进程的db访问

我想在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);

最佳答案 由sqlite3_busy_timeout安装的默认繁忙处理程序(src / main.c中的sqliteDefaultBusyCallback())休眠1ms然后再次尝试,然后持续2ms,5ms ……直到睡眠总时间超过指定的超时值.

因此,你的修复本质上复制了内部完成的操作,但是等待时间过长(sleep()的参数以秒为单位,因此你的代码会睡眠时间为18小时).顺便说一下,甚至60000ms = 60s对于超时而言似乎与sqlite3_busy_timeout相似,更不用说重试之间的退避时间了.

点赞