[问题] 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