我想在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相似,更不用说重试之间的退避时间了.