背景介绍:
android 数据库在非WAL模式下,写入数据的同时会阻塞其他线程读写,为什么呢?
分析:
分析过程主要在 SQLiteConnectionPool 源码中,可以结合观看。
当我们执行 sql 语句时,系统会申请一个 SQLiteSession,每个 SQLiteSession 需要向 SQLiteConnectionPool 申请一个 SQLiteConnection.
大致堆栈:
SQLiteConnectionPool 维护了一个主连接和一个连接List.
通常写数据库是需要申请主连接的,而主连接只有一个,别的 session 拿走了,其他 session 就要在一个 for 死循环中等待,这就是 SQLite 写互斥的原因。
而查询操作可以不申请主连接,使用普通连接就可以,但是我们没有开启 WAL 模式,连接池最大的连接数被限制为 1 ,无法创建新的连接,导致写操作时,读也会阻塞。
附:
网友评论