看板 AndroidDev 關於我們 聯絡資訊
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://www.ptt.cc/bbs/AndroidDev/M.1503040518.A.9E2.html ※ 編輯: magic704226 (118.163.87.77), 08/18/2017 15:15:27
ssccg: SQLiteOpenHelper用singleton並不需要確保只有一個thread讀 08/18 15:21
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.的問題
ssccg: 而即使開了WAL,還是應該用singleton,是SQLiteDatabase內 08/18 15:30
ssccg: 部實作去處理掉開多個connection,不是自己開多個DB物件 08/18 15:31
喔,理解,第一部分,我是參考 http://www.cnblogs.com/liaolandemengxiang/p/3977094.html
ssccg: 上面我是指多個Thread可以共用同一個SQLiteDatabase,沒有 08/18 15:57
ssccg: 必要像這頁說的加synchronized,只要SQLiteDatabase(Helper 08/18 15:57
ssccg: )實例只有一個,它內部本來就會處理掉同步問題 08/18 15:58
ssccg: 而WAL單純是SQLiteDatabase內部連接(開資料庫檔案)的模式不 08/18 15:59
ssccg: 同,沒開WAL時只有一個連線,所有方法呼叫會變成依序執行 08/18 15:59
ssccg: 不管是read還write 08/18 16:01
ssccg: 有開WAL會開多個連線,才有真的平行執行 08/18 16:04
ssccg: 總之要用SQLiteDatabase(Helper),就是用singleton或是放在 08/18 16:14
ssccg: ContentProvider,不用考慮有沒有multithread需求 08/18 16:15
ssccg: 真的有大量同時讀+寫的需求,就開WAL 08/18 16:15
理解,感謝s大,也算學長吧 ※ 編輯: magic704226 (118.163.87.77), 08/18/2017 16:34:05