【问题标题】:How to fix: java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed?如何解决:java.lang.IllegalStateException:无法执行此操作,因为连接池已关闭?
【发布时间】:2019-02-15 07:41:40
【问题描述】:

我的 android 数据库和游标有问题。有时(很少)会发生,我从客户那里得到崩溃报告。很难找出它崩溃的原因,所以它确实是一些小错误。

这里是例外:

java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
        at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:962)
        at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:599)
        at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348)
        at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)

然后我有这样的方法(它在 c.moveToNext() 行中因该错误而崩溃)。它几乎从不崩溃,但有时会崩溃,但我无法重现它。

public List<AlarmModel> getAlarms() {
    SQLiteDatabase db = this.getReadableDatabase();

    String select = "SELECT * FROM " + Alarm.TABLE_NAME +" WHERE "+ Alarm.COLUMN_NAME_ALARM_FLAVOR_ID+" = -1 ";

    Cursor c = db.rawQuery(select, null);

    List<AlarmModel> alarmList = new ArrayList<AlarmModel>();

    while (c.moveToNext()) {
        alarmList.add(populateModel(c));
    }

    if (!alarmList.isEmpty()) {
        if (db != null) {
            db.close();
        }
        if (c != null) {
            c.close();
        }
        return alarmList;
    }

    return null;
}

【问题讨论】:

  • 首先,您应该在if 语句中使用c.moveToFist() 并在您添加while 循环代码的if 正文中检查光标是否位于第一个位置。
  • 谢谢!我正在尝试你的建议
  • 那么为什么在while循环代码之前的if语句中使用c.moveToFist()?
  • 这是为了检查游标是否有值并且应该从从db检索到的数据的第一个位置开始..
  • 所以可以使用 (c != null) 代替 c.movetoFist() 吗?

标签: android


【解决方案1】:

多种因素可能会导致此问题: 一种。您在访问数据之前调用 db.close() 。 湾。或者 db.close() 正在被其他方法调用,而您仍在尝试从具有相同数据库引用的其他方法访问数据库中的数据。

【讨论】:

  • so db.close() 需要去掉吗?
  • 那么为什么这个问题很少发生?我无法复制。
【解决方案2】:

删除 db.close()

这可能是多线程问题,数据库被另一个线程关闭。你可以查看db.close()的所有地方。

我通常在 Application.onStart() 中打开数据库,只在 Application.onDestroy() 中关闭它。因此不用担心多线程数据库打开/关闭。

【讨论】:

  • 这意味着删除 db.close() 可以解决问题吗?我认为它可能会影响到其他地方
  • 我在 Play 商店中有大约 10 个 APP,在 Application.onDestroy 中只有 db.close()。我从来没有在数据库上遇到过任何问题。
  • @Le Minh 这意味着数据库是真正的“单例”,不应影响任何地方。
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 2015-07-12
  • 2013-02-05
  • 2013-04-10
  • 2014-06-16
  • 2016-02-11
  • 2017-10-23
  • 2014-10-18
相关资源
最近更新 更多