Banco de dados Android - Não é possível executar esta operação porque o pool de conexões foi fechado

Eu tenho um problema estranho com o banco de dados e cursores do Android. Ocasionalmente (muito raramente) acontece, que recebi relatórios de falhas de clientes. É difícil descobrir por que ele trava, pois eu tenho ~ 150.000 usuários ativos e talvez um relatório por semana, mais ou menos, então é realmente um bug menor. Aqui está a exceção:

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)

Antes de cada cursor "iterando e explorando", eu uso esse código para garantir que está tudo bem:

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

E cai na linha:

if (cursor.getCount() == 0)

Alguém sabe o porquê? Acho que estou verificando todas as possíveis exceções e condições ... Por que meu aplicativo está travando aqui?

PS: Todos os métodos de banco de dados são sincronizados e eu estou abrindo e fechando corretamente os cursores / banco de dados em todos os casos, verifiquei-o várias vezes.

questionAnswers(4)

yourAnswerToTheQuestion