房间 - 数据库 '/data/.../db' 的连接池已经无法为带有0x2标志的线程在X秒内提供连接。

4

错误信息

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中出现,直到我强制停止应用程序。
  • 所有其他查询都无法正常工作。

测试环境

  • ASUS Nexus 7(Android 5.1.1)- 100%可复制
  • Lenovo Tab 7(Android 7.0)- 仅体验1次

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

1个回答

2
根据我的观察,我将设备留下来处理这个问题差不多一个小时,接下来发现查询已经执行了,SQLite警告没有记录,SQL查询已经完成。我查看了复杂的SQL查询,发现多个LEFT JOIN(共6个)导致了重复记录,这些记录被GROUP BY处理。为了证明这一观察结果,我注释掉了复杂的SQL查询,此后在ASUS Nexus 7(Android 5.1.1)设备上就无法再次复制出错误。总之,对于任何可能遇到同样问题的人,请尝试检查查询的执行时间并进行优化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接