房间 - 数据库 '/data/.../db' 的连接池在 X 秒内无法授予标志为 0x2 的线程的连接
Room - The connection pool for database '/data/.../db' has been unable to grant a connection to thread with flags 0x2 for X seconds
错误信息
The connection pool for database '/data/data/com.app.test/databases/test-db' has been unable to grant a connection to thread 9734 (pool-3-thread-2) with flags 0x2 for 30.001001 seconds.
Connections: 1 active, 0 idle, 1 available.
Requests in progress:
executeForCursorWindow started 29982ms ago - running, sql="<<Complex SQL Query with an average of 3 LEFT JOINS>>"
在整个应用程序中,我们使用了 ROOM 和 LiveData。正是在这个片段上,有多个观察者正在发生(大约 9 个观察者)。对于观察到的每个 LiveData,有:
Transformations.switchMap()
Transformations.map()
- 每个模型都有
@Embedded
个注释,有些模型有多个 @Relation
个注释。
观察结果
- 错误消息不断涌入 LogCat,直到我强行停止
应用程序。
- 所有其他查询均无效。
测试环境
- 华硕 Nexus 7 (Android 5.1.1) - 100% 可重现
- Lenovo Tab 7 (Android 7.0) - 仅体验 1 次
我做了一些研究,但有 none 使用 ROOM 的人遇到了这个问题。
根据我的观察,我将这个问题留在设备上将近一个小时,然后发现查询继续进行并且 SQLite 警告没有记录,SQL 查询是已经执行了。
我查看了复杂的 SQL 查询,发现多个 LEFT JOIN
(其中 6 个)导致了由 GROUP BY
处理的重复记录。
为了证明这一观察,我注释掉了复杂的 SQL 查询,并且该错误无法再在 ASUS Nexus 7 (Android 5.1.1) 设备上复制。
总之,对于可能遇到相同问题的任何人,请尝试检查查询的执行时间并尝试对其进行优化。
错误信息
The connection pool for database '/data/data/com.app.test/databases/test-db' has been unable to grant a connection to thread 9734 (pool-3-thread-2) with flags 0x2 for 30.001001 seconds.
Connections: 1 active, 0 idle, 1 available.
Requests in progress:
executeForCursorWindow started 29982ms ago - running, sql="<<Complex SQL Query with an average of 3 LEFT JOINS>>"
在整个应用程序中,我们使用了 ROOM 和 LiveData。正是在这个片段上,有多个观察者正在发生(大约 9 个观察者)。对于观察到的每个 LiveData,有:
Transformations.switchMap()
Transformations.map()
- 每个模型都有
@Embedded
个注释,有些模型有多个@Relation
个注释。
观察结果
- 错误消息不断涌入 LogCat,直到我强行停止 应用程序。
- 所有其他查询均无效。
测试环境
- 华硕 Nexus 7 (Android 5.1.1) - 100% 可重现
- Lenovo Tab 7 (Android 7.0) - 仅体验 1 次
我做了一些研究,但有 none 使用 ROOM 的人遇到了这个问题。
根据我的观察,我将这个问题留在设备上将近一个小时,然后发现查询继续进行并且 SQLite 警告没有记录,SQL 查询是已经执行了。
我查看了复杂的 SQL 查询,发现多个 LEFT JOIN
(其中 6 个)导致了由 GROUP BY
处理的重复记录。
为了证明这一观察,我注释掉了复杂的 SQL 查询,并且该错误无法再在 ASUS Nexus 7 (Android 5.1.1) 设备上复制。
总之,对于可能遇到相同问题的任何人,请尝试检查查询的执行时间并尝试对其进行优化。