Bonjour,

Nous utilisons une dataSource C3P0 ainsi qu'Hibernate avec Spring pour notre projet

Ci dessous la config de 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>
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
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();
    }
}
Depuis cette mise en place, nous avons aléatoirement des problèmes de connexions sur les objets faisant appels à HibernateUtil

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!
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 **
Si vous avez une idée, je serais prenneur car je suis bloqué !

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