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

Frameworks Web Java Discussion :

Hibernate : mise en place de C3P0 : plantage : c3p0 utile ou pas?


Sujet :

Frameworks Web Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2011
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 109
    Points : 32
    Points
    32
    Par défaut Hibernate : mise en place de C3P0 : plantage : c3p0 utile ou pas?
    Bonjour.

    J'ai une application web qui fonctionne avec Hibernate correctement.

    Les filtres sont configurés comme cela dans le web.xml :
    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
     <filter>
    		<filter-name>SessionHibernateFilter</filter-name>
    		<filter-class>cont.util.SessionHibernateFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>SessionHibernateFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
        
        <!-- 2eme filtre pour struts -->
    	<filter>
    		<filter-name>struts2</filter-name>
    		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>struts2</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>

    Ma classe gérant l'ouverture de la session hibernate et fermeture après l'action est donc comme cela
    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
    ...
    public class SessionHibernateFilter implements Filter{
    ...
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response,
    			FilterChain chain) throws IOException, ServletException {
     
    		try
    		{
    			log.debug("doFilter : Ouverture de la session Hibernate");
    			HibernateUtil.currentSession();
    			log.debug("doFilter : Appel à chain.doFilter()");
    			chain.doFilter(request, response);
    		}
    		catch (Exception e)
    		{
    			log.error(Util.getStackTrace(e));
    		}
    		finally
    		{
    			log.debug("doFilter : Fermeture de la session Hibernate");
    			HibernateUtil.closeSession();
    		}
     
    	}
    ...
    }
    pour information, la classe hibernateUtil est comme cela :
    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 class HibernateUtil {
    ....
    	public static Session currentSession() throws HibernateException
    	{
    		Session s = (Session) session.get();
    		// Ouvre une nouvelle Session, si ce Thread n'en a aucune
    		if (s == null)
    		{
    			log.debug("Acquisition d'une nouvelle Session Hibernate pour le Thread " + Thread.currentThread().hashCode());
    			s = sessionFactory.openSession();
    			session.set(s);
    		}
    		log.debug("Récupération de la Session Hibernate " + s.hashCode() + " pour le Thread " + Thread.currentThread().hashCode());
    		return s;
    	}
     
    	public static void closeSession() throws HibernateException {
    		Session s = (Session) session.get();
            if ( s != null )
            {
            	log.debug("Fermeture de la Session Hibernate " + s.hashCode() + " pour le Thread " + Thread.currentThread().hashCode());
                session.set(null);
                s.close();
            }
     
    	}
     
    }
    Au démarrage de l'application, j'ai remarqué que les ligne suivantes du hibernate.cfg.xml ne sont pas prise en compte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <property name="hibernate.c3p0.max_size">20</property>
      <property name="hibernate.c3p0.max_statements">0</property>
      <property name="hibernate.c3p0.min_size">0</property>
      <property name="hibernate.c3p0.timeout">0</property>
      <property name="hibernate.c3p0.idle_test_period">600</property>
      <property name="hibernate.c3p0.acquire_increment">1</property>
    Ces lignes avait pour but de ne pas laisser des session hibernate "morte" ce qui peut arriver par exemple lorsqu'une base de données est éteinte lorsque l'application tourne toujours.

    J'ai donc lu qu'il fallait ajouter la bibliotheque "hibernate-c3p0-4.3.1.Final.jar", et la ligne suivante :
    <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>

    Cela a pour effet de faire dysfonctionner l'application, avec un plantage :
    java.lang.NoClassDefFoundError: Could not initialize class cont.dao.HibernateUtil
    at cont.util.SessionHibernateFilter.doFilter(SessionHibernateFilter.java:45)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    qui correspond au HibernateUtil.closeSession();

    Quelqu'un a-t-il déjà rencontér le problème?

    Faut-il tout simplement que j'enleve le paramétrage C3p0 qui ne sert peut etre pas à grand chose?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    C'est un tout petit peux ridicule d'aller utiliser c3p0 dans une application web. C3P0 permet de faire un pool de connexion... Ton conteneur web a déjà un pool de connections, utilise le. Défini le datasource dans ton hibernate et configure un datasource avec le même nom dans ton conteneur web. Tous les conteneurs ont leurs option pour tuer les connexions morte, garder les connexions vivante et même détercter les connexions perdues (quoi que ça ne devrais jamais arriver avec un code propre).

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2011
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 109
    Points : 32
    Points
    32
    Par défaut
    Merci pour cette réponse.

    Dans une application jsp basique, j'utilise ces options de pool directement dans un fichier context.xml

    Là, c'est la première fois que j'utilise hibernate, donc avec son fichier hibernate.cfg.xml
    A première vue, le lien fonctionnait mieux avec eclipse lorsqu'il y avait juste ce fichier de config et pas ce fichier + context.xml.

    Si je comprends bien, vous m'indiquer de continuer à utiliser un fichier context.xml comme avant, malgré l'utilisation d'hibernate.
    C'est ca?

    Merci

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ben oui, hibernate a une option de configuration pour pointer directement sur le pool du conteneur. Ca permet de sortir la config de ton programme.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2011
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 109
    Points : 32
    Points
    32
    Par défaut
    Parfait.
    Je vais me réorienter vers le context alors.
    même si le context.xml est mis dans le dossier meta-inf pour que ca se déploie tout seul, et à chaud via tomcat.

    Merci

Discussions similaires

  1. Réponses: 19
    Dernier message: 14/12/2012, 15h28
  2. [Hibernate Search] Mise en place
    Par Ghunter59 dans le forum Hibernate
    Réponses: 0
    Dernier message: 20/03/2011, 14h46
  3. Mise en place Connexion Mysql + EJB 3 + Hibernate
    Par Thomshao dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 01/12/2008, 19h21
  4. C3P0 Plantage en prod.
    Par tatemilio2 dans le forum Hibernate
    Réponses: 1
    Dernier message: 02/10/2008, 14h39
  5. Problème de mise en place de datasource pour Hibernate
    Par K-Kaï dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 27/07/2006, 10h41

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