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

JDBC Java Discussion :

Pb de connexions "Pool exhausted"


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 22
    Points
    22
    Par défaut Pb de connexions "Pool exhausted"
    Bonjour,

    j'ai un pb sur un de mes projets java/web.
    Au bout d'un certain temps d'utilisation, l'appli plante, et dans les log, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause: 
    java.util.NoSuchElementException: Timeout waiting for idle object
    Et ca, j'arrive pas a le comprendre car toutes les connexion sont systematiquement fermes .
    Ex :
    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
     
    sqlQuery = "select * from ??? where ?? = ???";
    		try{
    			conn = new Connexion(applicationRessource).getConnexion();
    			prst = conn.prepareStatement(sqlQuery);
    			ResultSet rs = prst.executeQuery();
     
    			if (rs.next()){
    				...
    			}
    			if (prst != null) try {prst.close();prst = null;} catch (SQLException e) {}
    			if (conn != null) try {conn.close();conn = null;} catch (SQLException e) {}
    			if (rs != null) try {rs.close();rs = null;} catch (SQLException e) {}
    			return total;
    		} catch (SQLException e1) {
    			...		}
    Est ce que vous pouvez me dire si c'est la bonne methode ou pas.

    D'avance, merci

  2. #2
    Expert éminent

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Points : 8 235
    Points
    8 235
    Par défaut
    Bonjour,

    C'est ce qu'on appelle une fuite de connexions. Tu ne dois pas libérer une connexion a un endroit...
    Une piste est dans la structure de ton code : la fermeture des connections doit se faire dans un bloc finally.
    Dans ton code si l'exécution de la requete lève une exception, tu sautes directement dans le bloc catch et ne libère jamais ta connexion.
    la structure est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try{
      recupération connexion 
      execution requete
      traitement réponse
    }catch(SQLException ex){
      traitement exception
    }finally{
      fermeture Resultset, Statement, Connection
    }
    Sinon tu as aussi des options dans les parametres du pools de connection DBCP pour forcé la récupération de connexions inactives. J'en parle dans mon tutoriel sur les pools de connections dans Tomcat :
    http://christophej.developpez.com/tu...ee/pooltomcat/

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    L'accès standard se fait de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Context ctx = new InitialContext();
    Datasource ds = (Datasource)ctx.lookup("java:comp/env/jdbc/MyDatasource");
    Connection cnx = ds.getConnection();
     
    ...
    ...
    Dans ton web.xml, tu rescence un datasource avec un <resource-ref>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <resource-ref>
      <res-ref-name>jdbc/MyDatasource</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
    </resource-ref>
    et dans ton serveur.xml tu défini ton pool !

    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
     
    <Context...>
      <Resource name="jdbc/MyDatasource" type="javax.sql.DataSource"/>
      <ResourceParams name="jdbc/MyDatasource">
     
        <parameter>
          <name>user</name>
          <value>dbusername</value>
        </parameter>
     
        <parameter>
          <name>password</name>
          <value>dbpassword</value>
        </parameter>
     
        <parameter>
          <name>driverClassName</name>
          <value>org.hsql.jdbcDriver</value>
        </parameter>
     
       <parameter>
          <name>driverName</name>
          <value>jdbc:HypersonicSQL:database</value>
        </parameter>
     
      </ResourceParams>
     
      ...
     
    </Context>
    le cnx.close() final ne fermeras pas la connexion mais la replaceras dans le pool.[/code]

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Bah c'est exactement ce que je fais dans mon code.
    En fait, la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    conn = new Connexion(applicationRessource).getConnexion();
    appelle une de mes classes qui se charge justement d'aller recuperer le datasource etc ...

    J'ai verifie, je ferme bien toutes mes connexions. Ou en tout cas, j'en ai bien l'impression ...

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Méa culpa alors, je ne comprennais pas pourquoi tu passais un paramètre "applicationResource" à ta méthode.

    sinon, tu ne ferme pas toutes les connexions dans ton code dans le cas d'une erreur SQLException

    Ajoute le bloc "finnaly" comme te l'indique christopheJ.

    Autre chose: tu utilise quoi comme base de données et qu'elle est ta requête réelle ?

    N'utiliserais tu pas du Oracle avec des requetes genre :

    "select * /* FIRST_ROWS */ from maTable where...... order by ....." ?

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    En fait, vous avez raison et je suis unr grosse truffe.
    Je pensais avoir mis les try/catch aux bons endroits mais en fait pas du tout !
    Dans le cas d'une erreur SQL, la connexion, effectivement, ne se ferme pas ...

    Merci de votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cannot get a connection, pool exhausted
    Par questionneuse dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 09/08/2007, 07h31
  2. [struts]pool exhausted?
    Par questionneuse dans le forum Struts 1
    Réponses: 4
    Dernier message: 10/05/2006, 22h46

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