如何解决:java.lang.IllegalStateException:由于连接池已关闭,无法执行此操作?

时间:2019-02-15 07:41:41

标签: android

我的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;
}

2 个答案:

答案 0 :(得分:0)

删除db.close()

这可能是一个多线程问题,数据库被另一个线程关闭。您可以检查db.close()的所有位置。

我通常在Application.onStart()中打开数据库,而仅在Application.onDestroy()中将其关闭。因此,不必担心多线程数据库的打开/关闭。

答案 1 :(得分:0)

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