最近我的应用程序开始出现以下错误。这不是在任何特定的地方,我只能在循环所有数据读/写功能时重现。它出现在任何地方。
09-14 08:52:15.089: WARN/SQLiteConnectionPool(19268): The connection pool for database '/data/data/com.nnn/databases/data.db' has been unable to grant a connection to thread 1 (main) with flags 0x5 for 30.000002 seconds.
Connections: 0 active, 1 idle, 0 available.
有什么方法可以避免这种情况吗?我明白我以某种方式耗尽了与数据库的所有连接? 我正在使用方法#1:http://www.androiddesignpatterns.com/2012/05/correctly-managing-your-sqlite-database.html
我的数据库代码如下所示:
public class DatabaseHelper extends SQLiteOpenHelper
{
private final static String LOG_TAG = "com.nnnn.data.DatabaseHelper";
private static final String DATABASE_NAME = "data.db";
private static final int DATABASE_VERSION = 260;
private static SQLiteDatabase databaseInstance;
public DatabaseHelper()
{
super(MyApplication.Me, DATABASE_NAME, null, DATABASE_VERSION);
}
public static synchronized SQLiteDatabase getDatabase()
{
if (databaseInstance == null) databaseInstance = (new DatabaseHelper()).getWritableDatabase();
return databaseInstance;
}
答案 0 :(得分:2)
我从未见过这个错误。但是,我想指出你没有在你链接的页面中使用方法#1 ,我相信你的实现会给你带来麻烦。
在您链接的设计模式中,他们的方法是确保在整个应用程序生命周期中只存在一个 DatabaseHelper 实例。您的方法不同,您试图确保在应用程序生命周期中只存在一个 SQLiteDatabase 实例。
所以在夏天,你试图为所有东西重用相同的数据库连接(这不是一个好主意,我强烈建议你改变这种方法),但实际上,我认为这种方法导致了一些问题SQLiteOpenHelper和您的静态实例变量。
您正在getDatabase方法中创建DatabaseHelper的新实例,当然,您的databaseInstance是静态的,但SQLiteOpenHelper实例存在潜在问题。例如,假设databaseInstance实例已关闭,并由一段代码设置为null。 Aka,有人在他们自己之后进行清理,然后在下次调用getDatabase()时,你将创建一个新的数据库助手,更重要的是,创建一个新的SQLiteOpenHelper。
答案 1 :(得分:0)
尝试从getDatabase方法中删除synchronized。这不应该是必要的。
答案 2 :(得分:-3)
我相信在Android中处理SQLite DB的唯一正确方法是使用ContentProvider。对于您的代码,您可以尝试将DatabaseHelper存储在该静态字段中,而不是SQLiteDatabase实例,如第一种方法中所述。