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
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 ... 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(); } } ... }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
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(); } } }
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.
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>
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.
Partager