IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Avis sur connexion MySQL


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Avis sur connexion MySQL
    Bonjour,

    J'ai créé une classe "ConSql" servant à la connexion MYSQL.

    Dans mes servlets, quand j'ai besoin d'une connexion, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    ConSql maconSql = new ConSql();
    maconSql.connexion("Select * from facture");
    try{
    while (maconSql.resultat.next())
    {
    // récupération des valeurs
    }
    }
    catch (SQLException ex) {
    ex.printStackTrace();
    }
    finally
    {
    try
    {
    if (maconSql.connexion!=null)
    maconSql.cpnnexion.close();
    }
    catch (SQLException ex) {
    ex.printStackTrace();
    }
    }
    Ensuite, dans la même servlet, si j'ai besoin d'une nouvelle connexion, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ConSql maconSql2 = new ConSql();
    maconSql2.connexion("Select * from ville");
    Est-il possible de réutiliser l'objet ConSql maconSql = new ConSql(); au lieu de recréer à chaque fois un objet maconSql1, maconSql2, maconSql3, ...

    Merci

  2. #2
    Membre éprouvé Avatar de kore62
    Profil pro
    Inscrit en
    Août 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 222
    Par défaut
    en général il vaut mieux utiliser une connexion pour un accés à la base de données et fermer cette connexion par sécurité.. aprés c'est possible de fairze ce que tu veux.. Mais je te conseil d'ouviri uyne connexion et de fermer la connexion aprés avoir fait ton resultSet...

    Aprés c'est à toi de voir..

    ++

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ok donc je reste sur la création d'un nouvel objet par requete.

  4. #4
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    Tu as deux approches :

    La première, consiste à faire une connexion pour chaqu'une des requête. Cette manière de faire est périeuse, et peut sécuritaire à mon sens.
    En effet, la connexion coute beaucoup à ton logiciel et à ta base de donnèes (en terme de temps machine), ensuite à chaque fois tu envoies login/code à la base de donnèes (crypté ou non, et ca c'est bof !), et enfin tu risque de générer plus d'erreur, plus de try, plus de catch, donc plus de code à maintenir.

    La seconde approche consiste à utiliser deux concept, la connexion persistante et les transactions. Cela consiste à utiliser une classe qui s'occupera de créer une connexion une seule et unique fois (ou plusieures fois pour créer un "pool de connexion") et de garder cette connexion active tant que cela est nécessaire. Dans la pratique c'est une classe du type Singleton (regarde les design pattern), qui à un constructeur qui initialise toute ta connexion, et des fonctions qui permettent d'envoyer du SQL. C'est un "Manager".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public class ConnexionManager {
      private static ConnexionManager _instance = null;
      private ConSql maconSql = null;
     
      /*
       * Ce constructeur ne peut être appelé de l'exterieur.
       * Il sert à initialiser la base de donnèes.
       */
      private ConnexionManager() {
        ConSql = new ConSql();
      }
     
      private ClassDeResultat executeSQL(String SQLQuery ) {
         ConSql.connexion(SQLQuery); //le nom connexion me parait peut approprié
         //Ici tu fais tes Try, catch etc...
         return maconSql.resultat;
      }
     
      public static ConnexionManager getInstance() {
        if ( _instance == null ) _instance = new ConnexionManager();
       return _instance;
      }
     
    }
    et pour l'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    ConnexionManager conManager = ConnexionManager.getInstance();
    ClassDeResultat res = conManager.executeSQL("Select * from facture");
    ...
    A noter que tu devras faire une petit bout de code en plus qui s'occupera de fermer la connexion à la BDD lorsque tu ferme la servlet.

    Enfin dans ton exemple tu peux réutiliser tes variables à souhait, du moment que tu fermes les connexion à la base de donnèes.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Pour ce projet, je vais rester sur le système exposé ci-dessus mais à l'avenir, j'utiliserai un pool de connexion.

    La fin de ton post signifie-t-elle que du moment où le code suivant est exécuté, je peux réutiliser l'objet maconSql au lieu de recréer maconSql1 puis maconSql2 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (maconSql.connexion!=null)
    maconSql.cpnnexion.close();
    }
    catch (SQLException ex) {
    ex.printStackTrace();
    }
    Merci

  6. #6
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    Oui, car une fois la connexion fermé, et lorsque l'objet est "déréférencé", ie aucune variable ne pointe vers l'objet, il est marqué pour suppression par le ramasse miette.

    Donc les variables Locales sont réutilisable à souhait.

    Mais c'est pas très propre, il serait bien plus propre de faire une fonction qui execute le SQL, et retourne une "List" (java.utils) comme un ArrayList par exemple.

    Par contre, et c'est dans un but d'amélioration, ton code, c'est du bricolage, il ne devrait pas y avoir de SQL dans cette partie de ton code (dans la partie qui faire des "actions", la partie métier.

Discussions similaires

  1. Avis sur configuration MySQL
    Par hungtuan dans le forum Administration
    Réponses: 0
    Dernier message: 23/05/2012, 18h28
  2. Chargement inifini sur connexion mysql
    Par thebutor dans le forum MySQL
    Réponses: 1
    Dernier message: 09/09/2010, 11h31
  3. Avis sur Certification MySql
    Par fluctus dans le forum Certifications
    Réponses: 5
    Dernier message: 19/09/2008, 08h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo