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

Tomcat et TomEE Java Discussion :

[Struts 1 / Oracle 11g / Tomcat] Pool de connexion


Sujet :

Tomcat et TomEE Java

  1. #1
    Candidat au Club
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut [Struts 1 / Oracle 11g / Tomcat] Pool de connexion
    Bonjour

    Je travaille avec struts 1 , une base de donnée oracle 11g et tomcat 6; j'aimerai utiliser les pools de connexion ci dessous les paramètres de mon contexte du serveur tomcat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Resource auth="Container" connectionCachingEnabled="true" driverClassName="oracle.jdbc.OracleDriver" 
    		factory="oracle.jdbc.pool.OracleDataSourceFactory" maxActive="100" maxIdle="10" 
    		maxWait="15000" name="jdbc/nomdatasource" password="le pwd" removeAbandoned="true" 
    		removeAbandonedTimeout="120" testWhileIdle="true" timeBetweenEvictionRunsMillis="120000" 
    		type="oracle.jdbc.pool.OracleDataSource" url="jdbc:oracle:thin:@localhost:1521:core" 
    		user="le user" validationInterval="30000" validationQuery="select 1
    Ici ma méthode de connexion
    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
      public  Connection openConnection() {
     
     
      Connection conn = null;
      try {
     
          // lecture du contexte JDNI de notre servlet
         Context initContext =  new InitialContext() ;
          // initialisation de ce contexte
         Context envContext  = (Context)initContext.lookup("java:/comp/env") ;
     
          // lecture de la datasource définie par requête JNDI
         DataSource ds = (DataSource)envContext.lookup("jdbc/nomdatasource") ;
          // demande d'une connexion à cette datasource 
         oraConnection = ds.getConnection();
     
            bIsOpen = true;
         //ici je définis le nombre de connexion ouvert (actif)
               nbOpenConn++;
    //ici je définis le nombre de connexion total ouvert et fermés 
               nbOpenAllConn++;
     
      }  catch (NamingException e) {
          // gestion de l'exception
      }  catch (SQLException e) {
     
      }
      return conn;
     }
    Sous oracle voici les paramètres de l'instance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER SYSTEM SET SHARED_SERVERS = 0 scope=spfile;
    ALTER SYSTEM SET PARALLEL_MAX_SERVERS=500 scope=spfile;
    alter system set processes=250 scope=spfile;
    ALTER SYSTEM SET sessions=500 scope=spfile;
    Lorsque nous nous connectons dessus 5 personnes pendant environ 10 à 15 mn le système nous déconnecte disant que nous avons atteint le nombre maximum de connexion oracle. Nous avons constaté que le nombre de connexion augmente même si on se déconnecte il ne diminue pas sous oracle.

    Si vous avez des notions ou explications à ce problème j'attends vos interventions avec impatience

    Merci

  2. #2
    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
    C'est très certainement dû au fait que vous ne fermez pas la connexion après usage.
    L'usage veut qu'on :
    - demande une connexion
    - utilise la connexion (via PreparedStatement ou autre)
    - ferme la connexion

    Le principe d'un pool est simple, il a un nombre de connexion disponibles pré-défini (ce nombre peut dépendre du paramétrage du pool mais également du nombre de connexions possibles suivant le SGBDR).
    A chaque fois que tu fais un ds.getConnection(), il va prendre une connexion disponible du pool et la marque "utilisée".
    Si tu ne libère pas la connexion, ds.getConnection() en prendra chaque fois une autre, jusqu'à ce qu'il n'y en ait plus de disponibles.

  3. #3
    Candidat au Club
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Bonjour merci de la réponse,

    ce qui me pose problème est que si je n'utilise pas les pools la nombre maximum qui a été paramétré dans oracle n'est jamais atteint, et pourtant nous appelons de la même manière la méthode openConnection.
    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
    31
    32
    33
    34
    35
    36
     protected void openConnectionBis()
          throws DBException {
     
     
        try {
          if (oraConnection == null || oraConnection.isClosed()) {
            try {
              // chargement de la classe en mémoire pour que le driver soit disponible
              Class.forName("oracle.jdbc.driver.OracleDriver");
     
            }
            catch (ClassNotFoundException e) {
              CoreLog.throwing("corebanking.donnees.DBOracle", "openConnection_1", e);
              throw new DBException("openConnection_1", e, "oracle.jdbc.driver.OracleDriver");
            }
     
            try {
              oraConnection = DriverManager.getConnection(CoreProperties.getDbUrl(),
                                                          CoreProperties.getDbUser(),
                                                          CoreProperties.getDbPwd());
              //#BS 20060608
              // teste de la performance
    //          oraConnection.setAutoCommit(false);
              bIsOpen = true;
              nbOpenConn++;
              nbOpenAllConn++;
            } catch (SQLException ex) {
              CoreLog.throwing("corebanking.donnees.DBOracle", "openConnection_2"+"/nbOpenAllConn/"+nbOpenAllConn, ex);
              throw new DBException("openConnection_2", ex, CoreProperties.getDbUrl());
     
            }
          }
        }
        catch (Exception ex1) {
        }
      }
    Existe t'il un paramètre du contexte du serveur tomcat qui libère les connexions?

  4. #4
    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
    Oui, il y a un paramètre qui permet de fermer une connexion active mais inutilisée (removeAbandonedTimeout)

    Dans tous les cas, il faut revoir le code et fermer la connexion après son usage.

  5. #5
    Candidat au Club
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Ok merci

    Je vais passer à revue le code pour fermer si ce n'était pas fait, j'espère vous revenir avec un résolu

  6. #6
    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
    Bonne chance, j'espère que ce n'est pas une énorme application

  7. #7
    Candidat au Club
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Bonjour me revoila!!!

    En fait j'ai une méthode qui fait que un select dans la base et affiche le résultat mais là je n'appelle pas close, est la peine ou non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void infoLotPresentationBis(CoreSelection cs, int aId) throws
         DBException {
     
             String sSql = " select LOTPRESCOMP_ID, LOTPRESCOMP_DATE, LOTPRESCOMP_DATERETOUR";
             sSql += " , TYPOPCOMP_Lib, TYPOPCOMP_DELAIRETOUR ||' jours' as  TYPOPCOMP_DELAIRETOUR";
             sSql += " from LOTPRESENTATIONCOMPENSE, TYPEOPERATIONCOMPENSE ";
             sSql += " where LOTPRESCOMP_ID = "+OracleFormat.setId(aId);
             sSql += " and LOTPRESCOMP_TYPEOPERATION_ID = TYPOPCOMP_ID";
     
       cs.executeSelect(sSql);
         }
    mais pour les autres nous fermons car nous sommes dans des boucles
    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
      public int oraExecute(String sSql)
          throws DBException {
     
        int nbRow = 0;                    // Nombre de lignes mises à jour par la requête
     
        CoreLog.info(sSql);
     
        try {
          openConnection();
          oraStatement = oraConnection.createStatement();
          nbRow = oraStatement.executeUpdate(sSql);
          commit();
     
        } catch(SQLException ex) {
          rollback();
          CoreLog.throwing("corebanking.donnees.DBOracle", "oraExecute", ex);
          throw new DBException("oraExecute", ex, sSql);
     
        } finally {
          close();
        }
        return nbRow;
      }
    Merci de votre aide

  8. #8
    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
    Elle est inutile cette fonction, elle ne renvoie pas de ResultSet et pourtant, c'est bien une requête de sélection... c'est la méthode appelée qui le fait ou il manque un bout ?

    Dans tous les cas, la connexion qui est utilisée ici doit aussi être fermée...

  9. #9
    Candidat au Club
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    oui c'est la fonction appelée qui fait la connexion, ici on ne fait qu'écrire la requête et on la donne en paramètre.

    La fermeture de la connexion je le fait ici ou c'est mieux de le faire dans la fonction executeSelect(String sql)?

    Merci

  10. #10
    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
    D'un point de vue général, directement à la fin de là où c'est utilisé.

    Dans ton cas, à priori, dans la méthode executeSelect(...)

  11. #11
    Candidat au Club
    Femme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Bonjour me revoilà!!!

    Nous avons parcouru tout le code et fermé les connexions qui ne les étaient pas. N'empêche mon problème persiste toujours après un moment de navigation le système nous déconnecte disant que le nombre maximum de connexion est atteint. or dans le pool j'ai bien spécifié qu'il doit libèrer les connexions inactives après 120 sexondes.

    Votre aide please merci

Discussions similaires

  1. Réponses: 8
    Dernier message: 29/04/2011, 12h02
  2. [ Tomcat ] Pool de connexion - pb autoReconnect
    Par spk4ever dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 06/01/2006, 16h39
  3. [Tomcat] Pool de connexion
    Par pataluc dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 05/04/2005, 16h14
  4. [TOMCAT] pool de connexion postgres
    Par kitov dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 04/06/2004, 16h13
  5. [tomcat 4.1] [oracle] Pool de connexion
    Par Franco dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 23/09/2003, 00h42

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