Erreur Impossible d'effectuer cette opération car le pool de connexion a été fermé

Je travaille avec sqlite db et j'utilise un code de Alex LockWood correctement Gestion de votre base de données SQLite

Cela fonctionne très bien mais parfois j'ai eu l'erreur "java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed." Voici l'erreur complète:

  • Gestion des scénarios de notification push sur iOS et Android
  • Liste de tri d'Android par ordre alphabétique
  • JRE sur Android
  • Android: comment étendre FragmentActivity et actionbaractivity
  • Quand appelez initLoader in Fragment?
  • Android Visualizer FFT / forme d'onde affectée par le volume du périphérique?
  •  02-20 16:37:21.385: W/dalvikvm(25730): threadid=13: thread exiting with uncaught exception (group=0x41c122a0) 02-20 16:37:21.390: E/AndroidRuntime(25730): FATAL EXCEPTION: Timer-0 02-20 16:37:21.390: E/AndroidRuntime(25730): java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. 02-20 16:37:21.390: E/AndroidRuntime(25730): at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:963) 02-20 16:37:21.390: E/AndroidRuntime(25730): at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:678) 02-20 16:37:21.390: E/AndroidRuntime(25730): at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:349) 02-20 16:37:21.390: E/AndroidRuntime(25730): at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894) 02-20 16:37:21.390: E/AndroidRuntime(25730): at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834) 02-20 16:37:21.390: E/AndroidRuntime(25730): at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62) 02-20 16:37:21.390: E/AndroidRuntime(25730): at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143) 02-20 16:37:21.390: E/AndroidRuntime(25730): at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133) 02-20 16:37:21.390: E/AndroidRuntime(25730): at com.uit.pokemon.DatabaseHandler.getStadiumStatusById(DatabaseHandler.java:533) 02-20 16:37:21.390: E/AndroidRuntime(25730): at playground.RoomActivity.checkTable(RoomActivity.java:276) 02-20 16:37:21.390: E/AndroidRuntime(25730): at playground.RoomActivity$6.run(RoomActivity.java:321) 02-20 16:37:21.390: E/AndroidRuntime(25730): at java.util.Timer$TimerImpl.run(Timer.java:284) 02-20 16:37:21.460: I/timertask cancel(25730): canceled 

    Et voici le code qui provoque l'erreur:

     public int getStadiumStatusById(int dataStadiumId){ SQLiteDatabase db = this.getReadableDatabase(); Cursor cur = db.rawQuery("SELECT " + keyStadiumId + " as _id, " + keyRoomName + ", " + keyP1Name + ", " + keyP1PokemonName + ", " + keyP1PokemonLevel + ", " + keyP1PokemonHp + ", " + keyP2Name + ", " + keyP2PokemonName + ", " + keyP2PokemonLevel + ", " + keyP2PokemonHp + ", " + keyTimeCreate + ", " + keyStadiumStatus + " from " + tbl_stadium + " WHERE " + keyStadiumId + " = " + "'" + dataStadiumId + "'", new String[] {}); int stadiumStatus = 0; if(cur.getCount()>0) { cur.moveToFirst(); stadiumStatus = cur.getInt(11); } db.close(); cur.close(); return stadiumStatus; } 

    J'ai essayé de googler pendant de nombreuses heures, mais pas de résultat. Aidez-moi à le réparer. Toute aide serait appréciée. Je vous remercie!

  • Créer un défilement alphabétique facile dans ListView?
  • Comment configurer la mise en page de manière dynamique dans Android
  • Base de données Android SQLite: insertion lente
  • Bonne solution pour conserver les éléments listview lorsque l'utilisateur tourne le téléphone et conserve toutes les données dans ArrayAdapter
  • Supprimez l'apk dans les tests alpha pour télécharger un autre avec le même code de version
  • Comment supprimer le fragment de FragmentPagerAdapter?
  • 4 Solutions collect form web for “Erreur Impossible d'effectuer cette opération car le pool de connexion a été fermé”

    Je traite également de ce problème. J'ai une idée de la cause et aimerais entendre les opinions des experts à ce sujet. Je fais de nombreuses hypothèses et je prends des conclusions non étayées par des preuves …

    Je pense que l'exception est lancée sur la ligne «retour StadiumStatus». Quelques lignes ci-dessus, vous affectez cette variable à un membre du Cursor. Je crois que vous assignez réellement le nom StadiumStatus pour pointer vers une variable int qui n'existe que dans le curseur. Une autre possibilité (énorme saut de logique ici) est que l'élément renvoyé par Cursor.getInt () est en fait un pointeur sur un élément (une méthode?) Dans la base de données ouverte (qui réside dans la mémoire car elle est ouverte). De toute façon, Lorsque vous fermez le Cursor et / ou la base de données, puis essayez de retourner StadiumStatus, l'int indique l'adresse dans le Cursor ou est passée par le Cursor, tente de le suivre, et se termine par le Cursor Fermé ou la base de données fermée (un C'est le «groupe de données» que vous utilisez.

    Si j'ai raison, je pense que la meilleure solution pour l'un ou l'autre serait de remplacer:

    "StadiumStatus = cur.getInt (11);"

    avec:

    "StadiumStatus = new Integer (cur.getInt (11));"

    Créant ainsi un nouvel Integer en mémoire que le vm peut jeter trivialement sur un int, et qui ne dépend que de sa portée traditionnelle pour l'accessibilité.

    Cette réponse a-t-elle un sens? Je suis sûr que le demandeur a longtemps dépassé ce problème, mais j'aimerais dire que j'ai répondu à une question sur Stack Overflow (ou pour savoir pourquoi je me trompe et avoir une meilleure compréhension des curseurs et des DB).

    Modifier: Ces réponses impliquent que je peux avoir raison:
    Erreur Android: impossible d'effectuer cette opération car le pool de connexion a été fermé
    Le curseur continuera-t-il en vie après la fermeture de la base de données?
    Dans la deuxième réponse, l'utilisateur DeeV, qui a une grande réputation, appelle les «connexions persistantes» des curseurs, ce qui implique qu'il ne s'agit pas d'une collection simple de valeurs retournées à partir du DB.

    Dans votre code, vous utilisez:

     db.close(); cur.close(); 

    La meilleure pratique est de fermer le curseur d'abord, puis de fermer la base de données une fois que vous appelez db.close() , cela rendra la base de données fermée et le curseur correspondant sera invalide. Essayez ce changement, il fonctionnera.

    Remplacez-le par:

     cur.close(); db.close(); 

    J'ai trouvé que cette exception survient également lors de l'utilisation de la base de données en multithreading. Il est donc préférable d'ajouter synchronized entre db = helper.getXXXDatabase() et db.close()

    Appel

    db.open()

    Après cette ligne:

     SQLiteDatabase db = this.getReadableDatabase(); 

    Cependant, je ne sais personnellement pas comment this.getReadableDatabase() fait exactement mais je voudrais simplement créer ma propre carte de base de données. Voir ce lien pour plus de détails: http://www.vogella.com/articles/AndroidSQLite/article.html

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.