sqlite3 api sqlite3_busy_timeout 與 sqlite3_busy_handler 的使用與區別

在用多數據連接方式使用sqlite時,常常會遇到SQLITE_BUSY的錯誤,這是由於使用當前連接訪問數據時,要申請相應級別的鎖,而各個級別的鎖有些是互斥的,當申請不到鎖時就會返回這個錯誤。這時只要稍等片刻,等其它連接的操作處理完,釋放了相斥的鎖之後就可以取得鎖並進行操作了。

  但是sqlite3中並未對出現sqlite_busy後重試做默認的處理,而是提供了一種處理機制busy handle。有兩個api可以創建busy handle。

int sqlite3_busy_handler(sqlite3 *, int (*)(void *, int), void *)

函數可以定義一個回調函數,當出現數據庫忙時,sqlite會調用該函數

當回調函數爲NULL時,清除busy handle,申請不到鎖直接返回

回調函數的第二個函數會被傳遞爲該由此次忙事件調用該函數的次數

回調函數返回非0,數據庫會重試當前操作,返回0則當前操作返回SQLITE_BUSY

int sqlite3_busy_timeout(sqlite3*, int ms);

定義一個毫秒數,當未到達該毫秒數時,sqlite會sleep並重試當前操作

如果超過ms毫秒,仍然申請不到需要的鎖,當前操作返回sqlite_BUSY

當ms<=0時,清除busy handle,申請不到鎖直接返回

從上面可以得知,一個函數可以控制超時的次數,一個函數可以控制超時的時間

但對於一個連接來說,只能有一個busy handle,所以兩個函數會相互影響,設置一個的同時會清除另一個,應根據需要來選擇。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章