我发现Android应用中很少有"java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed."
例外。我没有在许多地方关闭连接。连接也可能在某个其他线程中关闭。
只是为了确保SQLite连接是自动关闭还是由操作系统隐式关闭?
答案 0 :(得分:4)
此source建议您使用单例DatabaseHelper和一些do not demonify it。
这表明我不希望数据库在应用程序的生命周期内自行关闭。
第一来源@Alex Lockwood
方法#1:使用Singleton实例化SQLiteOpenHelper
将数据库助手声明为静态实例变量并使用 单例模式保证单例属性。示例代码 下面应该给你一个关于如何设计的好主意 DatabaseHelper类正确。
静态getInstance()方法确保只有一个DatabaseHelper 将在任何特定时间存在。如果sInstance对象没有 已初始化,将创建一个。如果已经创建了一个 然后它将被简单地返回。你不应该初始化你的助手 对象使用新的DatabaseHelper(上下文)!相反,总是使用 DatabaseHelper.getInstance(context),因为它保证只有一个 数据库助手将在整个应用程序的生命周期中存在。
第二来源@CommonsWare
拥有一个SQLiteOpenHelper实例可以帮助处理线程情况。 由于所有线程都将共享公共SQLiteDatabase, 提供了操作同步。
答案 1 :(得分:3)
是的 - 任何数据库连接都可以在您的背后关闭。如果dba决定终止你的连接,它可能发生在服务器端。如果出现问题,它可能发生在客户端。它可能由于各种原因发生在jdbc中。它甚至可能在您的代码中偶然发生。
虽然这里有一些含糊之处。您报告无法执行此操作,因为连接池已关闭。您的连接池不可能在您不知情的情况下关闭。此外,如果您正确使用连接池,如果它关闭,它将重新打开数据库连接。
答案 2 :(得分:1)
我只是在几个方面遇到过这种情况:
IE:
SQLiteDatabase db = getReadableDatabase();
//Read Operations
//process cursor
db.close(); //closes entire database connection and cursor is invalid throwing an error
调用活动上下文不再有效
答案 3 :(得分:0)
这是我个人的经历。
在我将代码用于臭名昭着的单例SQLİteOpenHelper方法后,随着辅助对象同步该对象上的所有数据库访问,事情变得更好。但是,它仍然不是最好的。
看,所有这些同步的东西都不是真正的原子,它们发生在你没有太多控制权的区域。因此,假设在查询之前,连接可能已被其他具有锁定的线程关闭。
您可以在查询之前检查连接,但如果关闭了该怎么办?你跳过做你需要做的事情?或者,您在具有控件的级别为特定的数据库访问集线器实现简单同步?我肯定会采取第二种方式。