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相似,更不用说重试之间的退避时间了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |