Случайная ошибка SQLiteConnectionPool на Android. Как избежать?

Недавно я начал получать следующую ошибку в своем приложении. Это НЕ в каком-либо конкретном месте, и я могу воспроизвести только в том случае, если цикл проходит через все функции чтения/записи данных. Это все происходит где угодно.

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

Ответы

Ответ 1

Я никогда не видел эту ошибку. Но я хотел бы указать, что вы не используете подход № 1 со страницы, с которой вы связались, и я считаю, что ваша реализация вызывает у вас проблемы.

В шаблоне проектирования, который вы связали, их подход состоит в том, чтобы гарантировать существование только одного экземпляра DatabaseHelper во всем жизненном цикле приложений. Ваш подход отличается, вы пытаетесь убедиться, что существует только один экземпляр SQLiteDatabase, хотя из-за жизненного цикла приложений.

Итак, в летнее время вы пытаетесь повторно использовать одно и то же соединение с базой данных для всего (что не очень хорошо, и я настоятельно рекомендую вам изменить этот подход), но на самом деле я считаю, что этот подход вызывает некоторые проблемы между SQLiteOpenHelper и вашу статическую переменную экземпляра.

Вы создаете новые экземпляры DatabaseHelper в методе getDatabase, конечно, ваша база данныхInstance статична, но здесь есть потенциальная проблема с экземплярами SQLiteOpenHelper. Например, предположим, что экземпляр базы данныхInstance закрыт и установлен на нуль куском кода. Ака, кто-то убирается после них, тогда в следующий раз, когда вызывается getDatabase(), вы создадите новый помощник базы данных и, что еще более важно, новый SQLiteOpenHelper.

Ответ 2

Попробуйте удалить синхронизированный метод getDatabase. Это не обязательно.

Ответ 3

Я считаю, что единственный правильный способ обработки SQLite DB в Android - использовать ContentProvider. Для вашего кода вы можете попытаться сохранить DatabaseHelper в этом статическом поле вместо экземпляра SQLiteDatabase, как описано в первом подходе.