室-数据库'/data/.../db'的连接池在X秒内无法授予与标志0x2的线程的连接

时间:2018-08-06 15:52:45

标签: android sqlite android-sqlite android-room android-livedata

错误消息

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)-仅1x体验

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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