android - 房间 - 数据库 '/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(其中 6 个)导致了由 GROUP BY 处理的重复记录。

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

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

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

相关文章:

android - 如何修复gradle.app中的版本不兼容

android - 如何在 Android 中避免此消息

python - sqlite3cursor.fetchall() 返回一个空数组

Android 应用启动时崩溃 : SQLite NullPointerException in ContactsFragment

java - getReadableDatabase 处的 IllegalStateException

java - 使用按钮增加变量

sqlite - 首先使用内存数据库集成测试 Entity Framework 代码

java - 测试串行 SQLite JDBC 时出现 NoClassDefFoundError 错误

android - 如何 : Provide notification to Android app whenever SQLite table updates

Android 设置viewpager的第一项