作者magic704226 (梅姬?沒雞?傻傻分不清楚)
看板AndroidDev
標題[問題] SQLite在MultiThreading下
時間Fri Aug 18 15:15:13 2017
SQLite在MultiThreading下
會有一個問題是
instance多個SQLiteOpenHelper
會發生SQLiteDatabaseLockedException: database is locked
解法兩種
(1)
SQLiteOpenHelper弄成Singleton
單例模式,確保一個時間只有一個Thread讀寫SQLite
SQLiteDatabase中
insert,update,execSQL operation都會調用lock()
只有有query()沒有調用lock()
(2)
API 11以上
直接用enableWriteAheadLogging()
因為multitheading read/write不是針對DB
是先對log
有沒考慮到的部分嗎
請各位高手指點
感謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.87.77
※ 文章網址: https://webptt.com/m.aspx?n=bbs/AndroidDev/M.1503040518.A.9E2.html
※ 編輯: magic704226 (118.163.87.77), 08/18/2017 15:15:27
1F:→ ssccg: SQLiteOpenHelper用singleton並不需要確保只有一個thread讀 08/18 15:21
2F:→ ssccg: 寫SQLite,多個thread共用它裡面一樣是serialized mode吧 08/18 15:22
S大,我看了網路的資訊和試了一下
那例子在某個thread,實例了多個 SQLiteDatabase
for(int i=0; i<4; i++)
{
DatabaseHelper helper = new DatabaseHelper(MainActivity.this);
allThreads.add(new DbInsertThread(helper, 100));
}
結果產生了The database file is locked.的問題
3F:→ ssccg: 而即使開了WAL,還是應該用singleton,是SQLiteDatabase內 08/18 15:30
4F:→ ssccg: 部實作去處理掉開多個connection,不是自己開多個DB物件 08/18 15:31
喔,理解,第一部分,我是參考
http://www.cnblogs.com/liaolandemengxiang/p/3977094.html
5F:→ ssccg: 上面我是指多個Thread可以共用同一個SQLiteDatabase,沒有 08/18 15:57
6F:→ ssccg: 必要像這頁說的加synchronized,只要SQLiteDatabase(Helper 08/18 15:57
7F:→ ssccg: )實例只有一個,它內部本來就會處理掉同步問題 08/18 15:58
8F:→ ssccg: 而WAL單純是SQLiteDatabase內部連接(開資料庫檔案)的模式不 08/18 15:59
9F:→ ssccg: 同,沒開WAL時只有一個連線,所有方法呼叫會變成依序執行 08/18 15:59
10F:→ ssccg: 不管是read還write 08/18 16:01
11F:→ ssccg: 有開WAL會開多個連線,才有真的平行執行 08/18 16:04
12F:→ ssccg: 總之要用SQLiteDatabase(Helper),就是用singleton或是放在 08/18 16:14
13F:→ ssccg: ContentProvider,不用考慮有沒有multithread需求 08/18 16:15
14F:→ ssccg: 真的有大量同時讀+寫的需求,就開WAL 08/18 16:15
理解,感謝s大,也算學長吧
※ 編輯: magic704226 (118.163.87.77), 08/18/2017 16:34:05