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

  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 actif Avatar de kore62
    Profil pro
    Inscrit en
    Août 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 222
    Points : 205
    Points
    205
    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 actif 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
    Points : 252
    Points
    252
    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 actif 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
    Points : 252
    Points
    252
    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.

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Si je peux me permettre, tu devrais déléguer à ta classe ConSql la seule responsabilité d'acquérir une connexion à ta base, ensuite, dans ton code, utilise des Statement ou PreparedStatement pour les requêtes.
    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
    26
    27
    28
    29
    30
     
    public void maFonction(...) throws Exception
    {
       Connection connection = null;
       try
       {
          connection = ConSql.getConnection();  // <--- méthode statique
          Statement stmt = connection.createStatement();
          ResultSet rs = stmt.executeQuery("select * from maTable");
          while ( rs.next() )
          {
             // ... le boulot ici ...
          }
     
          rs = stmt.executeQuery("select * from maDeuxièmeTable");
          while ( rs.next() )
          {
             // ... autre chose ...
          }
     
          // etc...
       }
       catch (Exception e)
       {
       }
       finally
       {
          if ( connection != null ) connection.close();
       }
    }
    Si par contre tu veux utiliser une requête à l'intérieur d'une boucle de traitement d'une autre, il faudra un deuxième Statement et accessoirement un deuxième ResultSet, c'est impératif...

    a+

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