web-dev-qa-db-fra.com

Meilleur endroit pour fermer la connexion à la base de données

Je cherchais depuis un moment la réponse à ma question mais je n'ai pas obtenu ce dont j'avais besoin. J'ai une application avec un ListView et un formulaire où je peux ajouter un nouvel enregistrement à la base de données. Il n'y a donc pas beaucoup de requêtes à faire.

Comment gérer les connexions à db? Dois-je le fermer après avoir obtenu ce que je veux ou dois-je le garder ouvert tout le temps jusqu'à la fermeture de l'application? Je veux savoir quelle est la meilleure façon de penser à la performance et à la durée de vie de la batterie.

53
Fixus

Selon ce post d'un ingénieur de Google (Dianne Hackborn) , il n'y a rien de mal à laisser la connexion à la base de données ouverte:

Android a pris une décision de conception délibérée, ce qui peut sembler surprenant, de simplement abandonner l'idée que les applications se terminent proprement et de laisser le noyau nettoyer leurs ressources. Après tout, le noyau doit de toute façon être capable de le faire. Étant donné cette conception, garder tout ouvert pendant toute la durée de vie d'un processus et ne jamais le fermer n'est tout simplement pas une fuite. Il sera nettoyé lorsque le processus sera nettoyé.

Donc, pour plus de simplicité, je voudrais étendre la classe Application pour fournir un seul point d'entrée bien défini pour votre code, et ouvrir la connexion à la base de données dans sa onCreate(). Stockez la connexion DB en tant que champ dans votre application et fournissez une méthode d'accesseur pour rendre la connexion disponible pour le reste de votre code.

Ensuite, ne vous inquiétez pas de le fermer.

109
Graham Borland

En général, je ferme la connexion dans la fonction onDestroy () de l'activité qui a ouvert la connexion. Je fermerais () un curseur d'une base de données dans la fonction qui utilise le curseur.

public MyActivity extends Activity{
    private myDatabase mDatabase; // myDatabase extends SQLiteOpenHelper
    private Cursor mCursor;

    public MyActivity(Context context){
        super(context);
        initMemberVariables();
    }

    public ElementButton(Context context, AttributeSet attrS){
    super(context, attrS);
        initMemberVariables();
    }

    public ElementButton(Context context, AttributeSet attrS, int defStyle){
        super(context, attrS, defStyle);
        initMemberVariables();
    }

    private void initMemberVariables(){
        mDatabase = new PSEdb(this.getContext());
    }

    private void getData(){
        mCursor = mDatabase.MyGetterFunction();
        while(mCursor.moveToNext()){
            try{
                // populate your data
            }catch(CursorIndexOutOfBoundsException ex){
                // handle the exception
            }
        }
        mCursor.close();
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        mDatabase.close();
    }
}
4
Darokthar

L'établissement de la connexion à la base de données coûte cher. Si les connexions ne sont pas limitées et que la base de données est locale, je garderais la connexion ouverte plutôt que de l'établir pour chaque opération d'écriture dans la base de données, comme vous le feriez généralement dans une application client-serveur qui doit évoluer vers accueillir un grand nombre d'utilisateurs simultanés.

4
Tim