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.