SQLite多线程并发操作
-
先理清楚一个概念 多线程操作和多数据库连接操作是不同的概念
-
多线程操作:多线程操作数据库时可以使用一个数据库连接,也可以每个线程使用各自的数据库连接
-
多数据库连接操作:即每个数据库操作使用的是各自的数据库连接
-
SQLite默认情况下只支持单个数据库连接操作,多连接并发操作时会出问题,需要开启wal模式才能进行多项城并发读操作,写操作仍能不可以并发。
如何理解?
- SQLite数据库仍能是一个文件,没有锁机制并发写操作是有问题的,所以最多只能实现并发读操作。
两种解决方案
- 1、多线程读,多线程写,只使用共同一个数据库连接,即使用同一个SQLiteHelper连接
- 这种情况下由于使用的是同一个数据库连接,SQLite内部有锁机制,不会出现异常。这种多线程操作并不是真正的并发操作,由于锁机制的存在所以仍能是阻塞的。
- 2、多线程读,单线程写,每个线程使用各自独立的数据库连接,但是需要开启wal模式,以开启数据库连接池
- 这种情况下是真的实现了多线程并发读操作,但是写操作仍能只可以单线程,如果多线程写(每个线程使用各自的数据库连接)就会出现问题。
两种方案对比
- 读操作效率上没有什么差别,在读取操作上,理论上并发操作越多方案2效率越高。在实际测试情况下100个线程并发读取,每个线程读取50次,方案一的用时是方案二的2倍多。
关于方案一的具体实现,有两种方式
- 1、开启一个数据库连接永不关闭,也是so上的大神推荐的做法
- 2、自己写一个管理类,具体实现见:android Sqlite多线程访问异常解决方案
如何开启wal模式?
- SQLiteDatabase.enableWriteAheadLogging();