Room - 数据库'/data/.../db'的连接池无法向带有标志0x2的线程授予连接 X 秒



错误消息

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 个观察者(。对于观察到的每个实时数据,都有:

  • Transformations.switchMap()
  • Transformations.map()
  • 每个模型都有@Embedded注释,有些模型有多个@Relation注释。

观察

  • 错误消息不断淹没 LogCat,直到我强制停止 该应用程序。
  • 所有其他查询都不起作用。

测试环境

  • 华硕 Nexus 7 (安卓 5.1.1( - 100% 可重现
  • 联想标签 7 (安卓 7.0( - 仅体验 1 倍

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

根据我的观察,我将此问题离开设备将近一个小时,然后发现查询继续进行并且SQLite警告未记录,并且SQL查询已经执行。

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

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

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

最新更新