[問題] SQLite在MultiThreading下

作者: magic704226 (梅姬?沒雞?傻傻分不清楚)   2017-08-18 15:15:13
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
有沒考慮到的部分嗎
請各位高手指點
感謝
作者: ssccg (23)   2017-08-18 15:21:00
SQLiteOpenHelper用singleton並不需要確保只有一個thread讀寫SQLite,多個thread共用它裡面一樣是serialized mode吧而即使開了WAL,還是應該用singleton,是SQLiteDatabase內部實作去處理掉開多個connection,不是自己開多個DB物件上面我是指多個Thread可以共用同一個SQLiteDatabase,沒有必要像這頁說的加synchronized,只要SQLiteDatabase(Helper)實例只有一個,它內部本來就會處理掉同步問題而WAL單純是SQLiteDatabase內部連接(開資料庫檔案)的模式不同,沒開WAL時只有一個連線,所有方法呼叫會變成依序執行不管是read還write有開WAL會開多個連線,才有真的平行執行總之要用SQLiteDatabase(Helper),就是用singleton或是放在ContentProvider,不用考慮有沒有multithread需求真的有大量同時讀+寫的需求,就開WAL

Links booklink

Contact Us: admin [ a t ] ucptt.com