2011-09-04 38 views
3

我想在SQLite數據庫中編寫幾個進程。這裏是我的c + +代碼:C++/SQLite - 具有多個進程的db訪問

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); 

回答

2

默認的(在SRC/main.c中sqliteDefaultBusyCallback())sqlite3_busy_timeout裝忙處理程序休眠的毫秒,然後再次嘗試,然後2MS,5ms的......直到總睡眠時間超過您指定的超時值。因此,您的修補程序基本上覆制了內部完成的工作,但是等待時間過長(睡眠參數(秒)爲秒,因此您的代碼睡眠時間爲18小時)。順便說一句,即使60000ms = 60s看起來像sqlite3_busy_timeout中的超時值,更不用說重試之間的退避時間。

相關問題