Est-il possible de perdre une connexion à la base de données SQLite?

Je vois quelques "java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed." Exceptions d'une application Android. Je n'ai pas fermé la connexion dans de nombreux endroits. Il est également possible que la connexion soit fermée dans un autre thread.

Juste pour s'assurer, est-il possible pour une connexion SQLite de se fermer automatiquement ou par le système d'exploitation ou implicitement?

  • Ligne # 17 du fichier XML binaire: erreur de classe de gonflage <inconnue> causée par UnsupportedOperationException: Impossible de convertir en dimension: type = 0x2
  • Utilisation de Google Places API
  • La synchronisation personnalisée ne fonctionne pas avec Google Account (com.google) sur certains périphériques Samsung
  • TextView android: ellipsize = "marquee" ne fonctionne pas comme prévu
  • Saisissez-vous le mot de passe Wifi par programme?
  • Android SDK équivoque pour viewWillAppear (iOS)?
  • Java.lang.RuntimeException: Handler (android.os.Handler) envoie un message à un gestionnaire sur un thread mort
  • Transparent, ProgressDialog sans bordure
  • Bibliothèque Android Viewer PDF sans licence GPL
  • L'Android se connecte au localhost du PC lorsque le débogueur est sur un appareil mobile
  • Android: Quelqu'un peut-il expliquer quelle est l'activité / Contexte / Intention dans Android?
  • Android Gyroscope tutoriel ou exemple de code
  • 4 Solutions collect form web for “Est-il possible de perdre une connexion à la base de données SQLite?”

    Cette source vous recommande d'utiliser une base de données DatabaseHelper, et certains ne la démontrent pas .

    Cela m'indiquerait que la base de données ne devrait pas se fermer tout simplement pendant la durée de votre application.

    Première Source @Alex Lockwood

    Approche # 1: Utilisez un Singleton pour Instantiater le SQLiteOpenHelper

    Déclarez votre assistant de base de données en tant que variable d'instance statique et utilisez le modèle Singleton pour garantir la propriété singleton. L'exemple de code ci-dessous vous donnera une bonne idée de la conception de la classe DatabaseHelper correctement.

    La méthode getInstance () statique garantit qu'un seul DatabaseHelper existera à un moment donné. Si l'objet sInstance n'a pas été initialisé, un sera créé. Si l'on a déjà été créé, il sera simplement retourné. Vous ne devez pas initialiser votre objet helper en utilisant le nouveau DatabaseHelper (contexte)! Au lieu de cela, utilisez toujours DatabaseHelper.getInstance (context), car il garantit qu'un seul assistant de base de données existe sur l'ensemble du cycle de vie de l'application.

    Deuxième Source @CommonsWare

    Avoir une seule instance SQLiteOpenHelper peut aider à lier des cas. Étant donné que tous les threads partagera Common SQLiteDatabase, la synchronisation des opérations est fournie.

    Oui – toute connexion à la base de données peut être fermée derrière votre dos. Cela peut arriver à la fin du serveur si un dba décide de tuer votre connexion. Cela peut arriver chez le client si quelque chose sort. Cela peut arriver à l'intérieur de jdbc pour diverses raisons. Cela peut même se produire par hasard dans votre code.

    Il existe cependant une certaine ambiguïté. Vous ne pouvez pas effectuer cette opération car le pool de connexion a été fermé . Il est peu probable que votre groupe de connexion soit fermé à votre insu. De plus, si vous utilisez un pool de connexion correctement, il rouvrira la connexion à la base de données si elle se ferme.

    Je n'ai rencontré que ce qui s'est produit dans quelques moyens:

    1. Vous fermez votre connexion à la base de données au lieu de fermer un curseur

    C'EST À DIRE:

     SQLiteDatabase db = getReadableDatabase(); //Read Operations //process cursor db.close(); //closes entire database connection and cursor is invalid throwing an error 
    1. Le contexte d'activité appelant n'est plus valable

    C'est mon expérience personnelle.

    Après avoir adopté mon code sur l'approche notoire de SQLton SingleTalkHelper, les choses se sont améliorées car l'objet helper synchronise tous les accès db sur cet objet. Mais encore, ce n'était pas encore le meilleur.

    Voyez, tous ces éléments de synchronisation ne sont pas vraiment atomiques et ils se produisent dans la zone où vous n'avez pas beaucoup de contrôle. Supposons donc que, juste avant votre requête, la connexion aurait pu être fermée par un autre thread qui possède le verrou.

    Vous pouvez vérifier la connexion avant vos requêtes, mais que faire si elle est fermée? Vous savez faire ce que vous devez faire? Ou vous implétez une synchronisation simple pour vos hubs d'accès db particuliers, au niveau où vous avez un contrôle? Je prendrais la 2ème manière à coup sûr.

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