Bonjour,
Nous utilisons une dataSource C3P0 ainsi qu'Hibernate avec Spring pour notre projet
Ci dessous la config de Spring
Certains de nos anciens services (métier) ne passe pas par Spring. Il font appel à un objet HibernateUtil dont le code source est ci dessous pour recupperer dans le thread local une sessionFactory pour faire des traitements dessus. Vous remarquerez que la sessionFactory sera recuppéré depuis le contexte Spring
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
37
38 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"><value>${jdbc.driverClass}</value></property> <property name="jdbcUrl"><value>${jdbc.url}</value></property> <property name="user"><value>${jdbc.username}</value></property> <property name="password"><value>${jdbc.password}</value></property> <property name="checkoutTimeout"><value>${c3p0.checkoutTimeout}</value></property> <property name="minPoolSize"><value>${c3p0.minPoolSize}</value></property> <property name="maxPoolSize"><value>${c3p0.maxPoolSize}</value></property> <property name="maxIdleTime"><value>${c3p0.maxIdleTime}</value></property> <property name="maxConnectionAge"><value>${c3p0.maxConnectionAge}</value></property> <property name="acquireIncrement"><value>${c3p0.acquireIncrement}</value></property> <property name="maxStatements"><value>${c3p0.maxStatements}</value></property> <property name="propertyCycle"><value>${c3p0.propertyCycle}</value></property> <property name="unreturnedConnectionTimeout"><value>${c3p0.unreturnedConnectionTimeout}</value></property> <property name="autoCommitOnClose"><value>${c3p0.autoCommitOnClose}</value></property> <property name="preferredTestQuery"><value>${c3p0.preferredTestQuery}</value></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource"><ref local="dataSource"/></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop> </props> </property> <property name="mappingDirectoryLocations"> <list> <value>classpath:/cmp</value> <value>classpath:/com/leaderinfo/novanet/entity</value> </list> </property> </bean> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
Depuis cette mise en place, nous avons aléatoirement des problèmes de connexions sur les objets faisant appels à HibernateUtil
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 public class HibernateUtil{ private static final ThreadLocal session = new ThreadLocal(); private static final Log logger = LogFactory.getLog(HibernateUtil.class); public static sql.Session currentSession() throws HibernateException{ Session sess = (Session) session.get(); if(sess == null){ SessionFactory sessionFactory = (SessionFactory)SpringBeanProvider.getBean("sessionFactory"); sess = sessionFactory.openSession(); session.set(sess); } return new sql.Session(sess); } public static void closeSession() throws HibernateException { Session sess = (Session) session.get(); session.set(null); if (sess != null) sess.close(); } }
Ci dessous les différentes erreurs
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 2009-11-05 11:48:49,452 WARN com.mchange.v2.c3p0.impl.NewPooledConnection http-80-84 ==> [c3p0] A PooledConnection that has already signalled a Connection error is still in use! 2009-11-05 11:48:49,452 WARN com.mchange.v2.c3p0.impl.NewPooledConnection http-80-84 ==> [c3p0] Another error has occurred [ java.sql.SQLException: No operations allowed after connection closed. Connection was closed explicitly by the application at the following location: ** BEGIN NESTED EXCEPTION ** java.lang.Throwable STACKTRACE: java.lang.Throwable at com.mysql.jdbc.Connection.close(Connection.java:1125) at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:549) at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470) at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964) at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) ** END NESTED EXCEPTION ** ] which will not be reported to listeners!Si vous avez une idée, je serais prenneur car je suis bloqué !
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 2009-11-05 11:44:19,217 WARN org.hibernate.util.JDBCExceptionReporter http-80-114 ==> SQL Error: 0, SQLState: 08003 2009-11-05 11:44:19,217 ERROR org.hibernate.util.JDBCExceptionReporter http-80-114 ==> No operations allowed after connection closed. Connection was closed explicitly by the application at the following location: ** BEGIN NESTED EXCEPTION ** java.lang.Throwable STACKTRACE: java.lang.Throwable at com.mysql.jdbc.Connection.close(Connection.java:1125) at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:549) at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470) at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964) at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) ** END NESTED EXCEPTION **
Je précise que ces erreurs n'apparaissaient pas quand nous construisions notre dataSource nous même et que nous avions une configuration hibernate chargée à part
Julien
Partager