房间 - 数据库 '/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,有:

观察结果

测试环境


我做了一些研究,但有 none 使用 ROOM 的人遇到了这个问题。

根据我的观察,我将这个问题留在设备上将近一个小时,然后发现查询继续进行并且 SQLite 警告没有记录,SQL 查询是已经执行了。

我查看了复杂的 SQL 查询,发现多个 LEFT JOIN(其中 6 个)导致了由 GROUP BY 处理的重复记录。

为了证明这一观察,我注释掉了复杂的 SQL 查询,并且该错误无法再在 ASUS Nexus 7 (Android 5.1.1) 设备上复制。

总之,对于可能遇到相同问题的任何人,请尝试检查查询的执行时间并尝试对其进行优化。