我想在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);
答案 0 :(得分:2)
sqlite3_busy_timeout(src / main.c中的sqliteDefaultBusyCallback())安装的默认繁忙处理程序会休眠1ms,然后再次尝试,然后持续2ms,5ms ......直到睡眠总时间超过指定的超时值。
因此,你的修复本质上复制了内部完成的操作,但是等待时间过长(sleep()的参数以秒为单位,因此你的代码会睡眠时间为18小时)。顺便说一下,即使60000ms = 60s对于超时而言似乎与sqlite3_busy_timeout相似,更不用说重试之间的退避时间了。