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

JDBC Java Discussion :

pb connection java easyPhp


Sujet :

JDBC Java

  1. #1
    Membre régulier
    pb connection java easyPhp
    Bonjour,
    Je réalise une application Java communiquant avec une bdd sous easyPhp.
    Je me connecte sans pb, mais, au bout d'un certain nombre de requete exécutées, le pg plante et le compilateur me met :

    java.sql.SQLException: Data source rejected establishment of connection, message from server: "Trop de connections"
    java.sql.SQLException: No operations allowed after statement closed.
    A chaque fois que j'effectue une requete, je créé un nouveau statement et un resultset. Je ferme ses 2 variables à la fin de chaque requete.
    Savez vous pourquoi, au bout d'un certain temps, j'ai cette erreur?

  2. #2
    Membre actif
    A priori, je suppose que tu dois créer une connexion a chaque fois que tu fais une requete, mais tu ne dois pas la fermer a la fin, du coup, lors du lancement de ton programme, tu dois te retrouver, si tu lances 100 requetes de maniere sequentielle, avec une connexion utile, et 99 presentes, mais qui ne servent a rien...

    Au choix, si tu fais vraiment du sequentiel, crée une connexion, un statement, et un resultset, et fais toutes tes requetes dessus.

    Si tu as par contre plusieurs acces possibles simultanément, si tu risques d'avoir beaucoup de connexions simultanément, tu peux lancer une connexion a chaque fois que tu lances une requete, et la fermer des que tu as fini de recupérer tes resultats...

    Ca rallonge un peu le traitement, mais ca limite le temps d'utilisation d'une connexion, donc ca diminue les chances d'avoir trop de connexions simultanément.

    Si tu as une appli client serveur, avec beaucoup de connexions BD possibles, le mieux est que les connexions BD soient lancées par le serveur. (limite, si tu utilises une servlet, tu peux avoir une seule connexion pour tout le monde, et eviter les accès concurents via un synchronized...)

    Si je n'ai pas repondu a ta question, detaille un peu plus le mode de fonctionnement de ton appli...

  3. #3
    Membre régulier
    En fait, ce qui est bizarre; c'est que pour chaque requete que je fais, je ferme la connection à la fin. C'est pour ca que je ne comprends pas tres bien. Voici un exemple de code : Dans une classe, j'ai une méthode connection avec des variables globales conn et stmt.
    Ensuite, avant d'effectuer une requete, j'appelle la méthode connection, créé un resultSet, et ferme ensuite le resultset et la connection. Ca te parrait correct?
    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 connection(){
        try{
     
          // Charge le pilote pour de la base
          Class.forName("com.mysql.jdbc.Driver");
          conn = DriverManager.getConnection(
              "jdbc:mysql://localhost/gestion parc info", "root", "");
          // Crée un objet pour envoyer des requêtes à travers la connection
          stmt = conn.createStatement();
         } catch(Exception e){System.out.println("" + e);}
     }
     
    public String retrouverNo(int n){
        //retrouve le no du bureau à partir de son code
        try{
          if (n==0){return "";}
          else{
       connection();
       ResultSet res = stmt.executeQuery("Select nobureau from bureau where codeBureau = '"+n+"'");
       res.next();
       if(res.wasNull()){res.close(); stmt.close();return null;}
     else {
       String no = res.getString(1);
       res.close();
       stmt.close();
       return no;
    }
     }}
      catch (Exception e) {System.out.println("" + e); return null;}
     }


    modéré par lunatix : ajout de balises code

  4. #4
    Membre actif
    A priori, au regard de ton code, tu ouvres une connexion, tu crées un Statement, tu crées un Resultset. Jusqu'ici tout va bien...

    Tu lances ensuite ta requete, sur ton objet statement, ca va toujours...

    Lorsque tu as fini, (resultset vide ou non) tu fermes ton resultset, tu fermes ton statement, MAIS, tu ne fermes jamais ta connexion...

    Il te manque un
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    conn.close();

    a la fin.

    Statement et Connection sont des objets de type différents. Ta connexion est recréé a la fin, mais la précédente n'est pas fermée...
    -> connexion fantome...

  5. #5
    Membre régulier
    Ah OK super! Merci beaucoup pour ton aide.
    Bon WE

  6. #6
    Membre actif
    Je t'en prie, bon week end...

    Et n'oublie pas le tag Resolu, si ca marche bien...

###raw>template_hook.ano_emploi###