加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:26:58 所属栏目:百科 来源:网络整理
导读:我想在SQLite数据库中编写几个进程.这是我的c代码: stringstream sstream "BEGIN;" query "COMMIT;";sqlite3_busy_timeout(databasePtr,60000); // set timeout if sql busyif((result = sqlite3_exec(databasePtr,(sstream.str()).c_str(),NULL,NULL)) !=
我想在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)) != 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,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相似,更不用说重试之间的退避时间了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读