2011-07-13 43 views
28

我有一個包含一些表的數據庫。 我想用多個線程更新表格。 我將在所有線程中使用SQLiteDatabase的相同實例。Sqlite數據庫實例是否線程安全

請建議這種方法是否正確。 Sqlite數據庫線程安全嗎? 兩個不同的線程可以同時更新不同的一組值的同一個表。

+0

可能重複的[Android上SQLite的最佳實踐是什麼?](http://stackoverflow.com/questions/2493331/what-are-the-best-practices-for-sqlite-on-android) –

+0

你應該使用鎖定在https://stackoverflow.com/questions/12758655/sqlitedatabase-multi-thread-locking-pattern中描述的 –

回答

23

[錯誤:]不,默認情況下它不是線程安全的。您應該使用鎖定相關的SQLiteHelper方法來提供線程安全性。

[編輯]: SQLiteDatabase類默認提供了一個鎖定機制(見註釋),如果您是在多線程運行,則不必考慮改變任何事都要線程安全。

搜索本文檔中的 '線':http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

並瞭解更多關於:

+11

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html #setLockingEnabled%28boolean%29'通過在關鍵部分中使用鎖來控制SQLiteDatabase是否是線程安全的。這非常昂貴,所以如果你知道你的數據庫只能被單個線程使用,那麼你應該將它設置爲false。默認是真實的......這是否意味着默認情況下它是線程安全的? – Ryan

+1

嗯。應該是,現在我錯了。嗯。 –

+1

「此方法在API級別16中已被棄用。 此方法現在什麼都不做。不要使用。」 –

-2

如果你把它..

setLockingEnabled(布爾lockingEnabled) 控制的SQLiteDatabase是否被線程安全使用圍繞鎖的關鍵部分。

2

您可以通過setLockingEnabled來控制數據庫是否線程安全。

控制SQLiteDatabase是否通過在關鍵部分中使用鎖來使線程安全。這非常昂貴,所以如果你知道你的數據庫只能被單個線程使用,那麼你應該將它設置爲false。默認爲真

所以我認爲這回答你的問題。

setLockingEnabled在API級別折舊16

+4

棄用在API 16 –

3

的Android使用java的鎖定機構,以保持SQLite數據庫訪問串行化的方法。所以,如果多個線程有一個db實例,它總是以序列化的方式調用數據庫,當然數據庫是線程安全的

如果我們確認,我們正在使用的數據庫從單線程我們不得不選擇通過調用setLockingEnable(false)設置數據庫內部鎖定禁用但這種方法從API 16級了deprecated並不再使用。如果您在SQLiteDatabase類中看到此方法的實現,那麼您將在其中找不到任何空方法。

public void setLockingEnabled (boolean lockingEnabled) 

此方法現在什麼都不做。不使用。我們應該採取照顧

的一件事是,我們應該讓你的助手類的一個實例(即通過使單),並共享同一個實例多個線程和操作之間不叫close()數據庫,否則您可能會收到以下異常:

java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase

所以,不叫database.close()在訪問數據庫之間,數據庫自身將進行關閉操作時,內部所有的操作就完成。