18

最近、アプリケーションで次のエラーが発生し始めました。これは特定の場所ではなく、すべてのデータの読み取り/書き込み機能をループする場合にのみ再現できます。それはかなりどこにでも出てきます。

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;
    }
4

3 に答える 3

2

このエラーは見たことがありません。ただし、リンク先のページのアプローチ #1 を使用していないことを指摘したいと思います。実装が問題を引き起こしていると思います。

リンクした設計パターンでは、彼らのアプローチは、アプリケーションのライフサイクル全体でDatabaseHelperインスタンスが 1 つだけ存在するようにすることです。あなたのアプローチは異なります。アプリケーションのライフサイクルを通じて、 SQLiteDatabaseインスタンスが 1 つだけ存在するようにしようとしています。

したがって、要約すると、すべてに対して同じデータベース接続を再利用しようとしています (これは良い考えではなく、このアプローチを変更することを強くお勧めします) が、実際には、このアプローチが SQLiteOpenHelper とあなたの間でいくつかの問題を引き起こしていると思います静的インスタンス変数。

getDatabase メソッドで DatabaseHelper の新しいインスタンスを作成しています。確かに、databaseInstance は静的ですが、SQLiteOpenHelper インスタンスには潜在的な問題があります。たとえば、databaseInstance インスタンスがクローズされ、コードによって null に設定されているとします。つまり、誰かが後始末をしていて、次に getDatabase() が呼び出されたときに、新しいデータベース ヘルパーを作成し、さらに重要なことに、新しい SQLiteOpenHelper を作成します。

于 2012-10-19T11:00:05.043 に答える
0

getDatabaseメソッドから同期を削除してみてください。これは必要ないはずです。

于 2013-02-19T19:29:42.980 に答える