c++ /SQLite -数据库访问与多进程

C++/SQLite - db access with multiple processes

本文关键字:访问 多进程 数据库 SQLite c++      更新时间:2023-10-16

我想在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被调用的频率吗?或者在60000 (ms)之后只有一个调用,如果第一次尝试返回SQLITE_BUSY?

我试着用下面的代码来解决这个问题。但看起来一直只有一个活动进程。其他进程将不会完成…

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 (sqliteDefaultBusyCallback() in src/main.c)安装的默认繁忙处理程序休眠1ms,然后再次尝试,然后为2ms, 5ms…直到总睡眠时间超过指定的超时值。

所以你的修复基本上复制了内部所做的事情,但是有了不可用的长等待时间(sleep()的参数是以秒为单位的,所以你的代码休眠了大约18个小时)。顺便说一下,即使是60000ms = 60s对于sqlite3_busy_timeout中的超时来说似乎也太长了,更不用说重试之间的后退时间了。