[問題] SQLite在MultiThreading下

看板AndroidDev作者 (梅姬?沒雞?傻傻分不清楚)時間7年前 (2017/08/18 15:15), 7年前編輯推噓0(0014)
留言14則, 1人參與, 最新討論串1/1
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

08/18 15:21, , 1F
SQLiteOpenHelper用singleton並不需要確保只有一個thread讀
08/18 15:21, 1F

08/18 15:22, , 2F
寫SQLite,多個thread共用它裡面一樣是serialized mode吧
08/18 15:22, 2F
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.的問題

08/18 15:30, , 3F
而即使開了WAL,還是應該用singleton,是SQLiteDatabase內
08/18 15:30, 3F

08/18 15:31, , 4F
部實作去處理掉開多個connection,不是自己開多個DB物件
08/18 15:31, 4F
喔,理解,第一部分,我是參考 http://www.cnblogs.com/liaolandemengxiang/p/3977094.html

08/18 15:57, , 5F
上面我是指多個Thread可以共用同一個SQLiteDatabase,沒有
08/18 15:57, 5F

08/18 15:57, , 6F
必要像這頁說的加synchronized,只要SQLiteDatabase(Helper
08/18 15:57, 6F

08/18 15:58, , 7F
)實例只有一個,它內部本來就會處理掉同步問題
08/18 15:58, 7F

08/18 15:59, , 8F
而WAL單純是SQLiteDatabase內部連接(開資料庫檔案)的模式不
08/18 15:59, 8F

08/18 15:59, , 9F
同,沒開WAL時只有一個連線,所有方法呼叫會變成依序執行
08/18 15:59, 9F

08/18 16:01, , 10F
不管是read還write
08/18 16:01, 10F

08/18 16:04, , 11F
有開WAL會開多個連線,才有真的平行執行
08/18 16:04, 11F

08/18 16:14, , 12F
總之要用SQLiteDatabase(Helper),就是用singleton或是放在
08/18 16:14, 12F

08/18 16:15, , 13F
ContentProvider,不用考慮有沒有multithread需求
08/18 16:15, 13F

08/18 16:15, , 14F
真的有大量同時讀+寫的需求,就開WAL
08/18 16:15, 14F
理解,感謝s大,也算學長吧 ※ 編輯: magic704226 (118.163.87.77), 08/18/2017 16:34:05
文章代碼(AID): #1PbfG6dY (AndroidDev)
文章代碼(AID): #1PbfG6dY (AndroidDev)