2016-09-19 89 views
4

我們在Xamarin應用程序中使用SQLite.NET PCL。SQLite.NET PCL繁忙異常

當通過插入多個表使數據庫處於壓力下時,我們看到拋出了BUSY異常。

任何人都可以解釋什麼是BUSY和LOCKED之間的區別?什麼導致數據庫繁忙?

我們的代碼使用使用下面的代碼創建的數據庫的單個連接:

var connectionString = new SQLiteConnectionString(GetDefaultConnectionString(), 
                 _databaseConfiguration.StoreTimeAsTicks); 
var connectionWithLock = new SQLiteConnectionWithLock(new SQLitePlatformAndroid(), connectionString); 

return new SQLiteAsyncConnection (() => { return connectionWithLock; }); 

回答

2

所以我們的問題竟然是,雖然我們已經在類中保證,我們會寫,它只是創建到數據庫的連接我們並沒有確保這個類是單例,因此我們仍然創建了多個到數據庫的連接。一旦我們保證這是一個單身那麼忙錯誤停止

我所採取的是這樣的:

鎖定意味着你有多個線程試圖訪問數據庫,代碼本身不是線程安全的。

忙意味着你有一個線程在另一個線程上等待完成,你的代碼是線程安全的,但你在使用數據庫時看到了爭用。

1

...當前操作無法繼續,因爲所需要的資源鎖定 ...

我是假設您正在使用async -style inserts並且在不同的線程上d因此插件正在等待不同插件的鎖定完成。您可以使用同步插入來避免這種情況。我個人在需要時通過創建一個FIFO隊列並在專用線程上同步使用該隊列來避免這種情況。您也可以在讓Exception波動起來之前重試您的交易X次數來處理這種情況。

SQLiteBusyException是SQLite返回SQLITE_BUSY或SQLITE_IOERR_BLOCKED錯誤代碼時引發的特殊異常。這些代碼意味着當前操作無法繼續,因爲所需的資源被鎖定。

當通過SQLiteConnection.setBusyTimeout(long)設置超時時,SQLite將在返回此錯誤之前嘗試在指定的超時期間獲取鎖定。

編號:http://www.sqlite.org/lockingv3.html

編號:http://sqlite.org/capi3ref.html#sqlite3_busy_timeout