Android数据库 - 无法执行此操作,因为连接池已关闭 [英] Android database - Cannot perform this operation because the connection pool has been closed

查看:689
本文介绍了Android数据库 - 无法执行此操作,因为连接池已关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个奇怪的问题,android数据库和游标。时间(很少)发生,我得到客户的崩溃报告。很难找出为什么它崩溃,因为我有约15万活跃用户和可能每周大约1报告,所以这真的是一个小小的错误。以下是异常:

I have strange problem with android database and cursors. Time to time (very rarely) happens, that I got crash report from customers. It's hard to find out why it crashes, as I have ~ 150 000 active users and maybe 1 report per week or so, so it's really some minor bug. Here is exception:

STACK_TRACE=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)
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834)
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:144)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
at sk.mildev84.agendareminder.a.c.a(SourceFile:169)

在每个游标迭代和探索之前,我使用这个代码确保一切正常:

Before every cursor "iterating and exploring" I use this code to make sure everything is ok:

db = instance.getWritableDatabase();
cursor = db.rawQuery(selectQuery, null);

if (isCursorEmptyOrNotPrepared(cursor)) {
    ...
    }

private synchronized boolean isCursorEmptyOrNotPrepared(Cursor cursor) {
        if (cursor == null)
            return true;

        if (cursor.isClosed())
            return true;

        if (cursor.getCount() == 0) // HERE IT CRASHES
            return true;

        return false;
    }

它在行:

if (cursor.getCount() == 0)


$ b b

任何人知道为什么?我想,我检查所有可能的异常和条件...为什么我的应用程序崩溃这里?

Anyone know why? I think, I am checking all possible exceptions and conditions...Why is my app crashing here?

PS:所有数据库方法是同步的,我正确打开和关闭

PS: All database methods are synchronized and I am correctly opening and closing database/cursors in all cases, I checked it many times.

推荐答案

问题

如果在关闭数据库之后尝试另一个操作,它会给你一个异常。因为 db.close(); 释放对对象的引用,关闭对象,如果最后一个参考被释放。
解决方案

保留一个 SQLiteOpenHelper 实例( Singleton )在静态上下文。执行延迟初始化,并且同步该方法。例如

Problem
If you try another operation after closing the database, it will give you that exception.Because db.close(); releases a reference to the object, closing the object if the last reference was released. Solution
Keep a single SQLiteOpenHelper instance(Singleton) in a static context. Do lazy initialization, and synchronize that method. Such as

public class DatabaseHelper
{
    private static DatabaseHelper instance;

    public static synchronized DatabaseHelper getInstance(Context context)
    {
        if (instance == null)
            instance = new DatabaseHelper(context);

        return instance;
    }
//Other stuff... 
}

你不必关闭它?当应用关闭时,它会放开文件引用,如果它甚至持有它
0047
即您不应关闭数据库,因为它将在下次调用中再次使用。
只需删除

And you don't have to close it? When the app shuts down, it’ll let go of the file reference, if its even holding on to it.
i.e. You should not close the DB since it will be used again in the next call. So Just remove

db.close();

详情请参阅单个SQLite连接

这篇关于Android数据库 - 无法执行此操作,因为连接池已关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆