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

标签 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。正是在这个 fragment 上发生了多个观察者(大约 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 并遇到过这个问题。

    最佳答案

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

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

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

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

    关于android - Room - 数据库 '/data/.../db' 的连接池在 X 秒内无法授予与标志为 0x2 的线程的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51711456/

    相关文章:

    android - 我可以使用ACTION_VIEW查看我下载的JPG吗?

    android - 在 SQLite 数据库中处理 bool 值

    android - LinearLayout源码中的虚拟子节点数是什么意思

    android - WifiManager.getScanResults() 在 android 上返回空列表

    java - 显示来自 SQLiteDatabase 的数据时出现 OutOfMemory 错误

    SQL中集合的Python字典

    java - 静态数据库连接 SQLite

    java - 通过PHONE.CONTENT_URI检索联系人返回重复的行

    android - 无法使用Kotlin以编程方式检索资源

    java - 同时阅读3个选定项目