Bonjour à tous,
Je fais face à un problème depuis quelques jours que je n’arrive pas du tout à résoudre malgré de multiples recherches.

Mon objectif est simple : faire en sorte que mon application Spring/hibernate (tournant sur JBOSS AS7) soit capable de se reconnecter automatiquement lorsqu’elle subit une déconnexion à la BDD (panne du serveur …). La seule contrainte que j’ai est de garder la définition de la BDD hors de mon EAR, à savoir dans une datasource configurée sous JBOSS et accessible via JNDI (ayant plusieurs modules pointant sur la même base, je voudrais garder la configuration du logiciel aussi simple et rapide que possible, et surtout ne pas avoir à recompiler pour changer de BDD).

Pour info la BDD tourne sous un SQLServer 2008 et j’utilise sqljdbc4 comme driver.
J’ai réussi à le faire avec c3p0, seulement je suis obligé de déclarer ma source de données dans le « applicationContex t », ce qui ne me va pas du tout.
J’ai donc essayé de configurer le pool de connexion à partir de JBOSS comme suit :

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
 
 
<datasource jndi-name="java:jboss/datasources/MyDataSource" pool-name="MyPoolName" enabled="true" use-java-context="true">
                    <connection-url>jdbc:sqlserver://******</connection-url>
                    <driver>sqljdbc4.jar</driver>
                    <pool>
                        <min-pool-size>10</min-pool-size>
                        <max-pool-size>100</max-pool-size>
                        <prefill>true</prefill>
                    </pool>
                    <security>
                        <user-name>***</user-name>
                        <password>****</password>
                    </security>
                    <validation>
                        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"/>
                    </validation>
                </datasource>
Mon applicationContext.xml est configuré comme suit avec un gestionnaire de transaction et un entityManagerFactory initialisés à partir de ma source de données récupérée depuis JNDI :

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
39
40
41
42
43
44
45
 
 
<beans 
	xmlns="http://www.springframework.org/schema/beans" 
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:tx="http://www.springframework.org/schema/tx" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:jee="http://www.springframework.org/schema/jee"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans       
		http://www.springframework.org/schema/beans/spring-beans-3.0.xsd       
		http://www.springframework.org/schema/tx       
		http://www.springframework.org/schema/tx/spring-tx-3.0.xsd       
		http://www.springframework.org/schema/context      
		http://www.springframework.org/schema/context/spring-context-3.0.xsd
		http://www.springframework.org/schema/jee
		http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
		">
 
		<jee:jndi-lookup id="myDataSource" jndi-name="jboss/datasources/MyDataSource"/>
 
 
 
    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
      <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
      </property>
    	<property name="persistenceUnitName" value="MyPersistenceUnit"/>
    	<property name="dataSource" ref="myDataSource"/>
    </bean>
 
    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
 
    <!--bean post-processor for JPA annotations-->
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
 
    <!--Exception translation bean post processor-->
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
 
     <!-- enable the configuration of transactional behavior based on annotations -->
    <tx:annotation-driven transaction-manager="transactionManager"/>   
 
</beans>
J'utilise un OpenEntityManagerInViewFilter en plus de tout cela, j'ai essayé de le désactiver mais j'ai le même problème.

Je paramètre mon persistence Unit comme suit :

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
 
 
<?xml version="1.0" encoding="UTF-8"?>
<persistence 
	version="2.0" 
	xmlns="http://java.sun.com/xml/ns/persistence" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
 
	<persistence-unit name="MyPersistenceUnit" transaction-type="RESOURCE_LOCAL">
 
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
 
<class>...mes entités...</class>		
 
		<properties>
 
 
			<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
			<property name="hibernate.show_sql" value="false" />
			<property name="hibernate.format_sql" value="false" />
 
		</properties>
	</persistence-unit>
</persistence>
J’injecte le persistence context comme suit dans mes DAO :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
 
  @PersistenceContext( type = PersistenceContextType.EXTENDED )
  protected EntityManager em;
J’annote mes méthodes de mes services comme suit :

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
 
 
@Service( "userCredentialService" )
@Scope(value="session")
@Transactional( propagation = Propagation.REQUIRED )
public class UserCredentialSpringService {
 
(...)
 
@Transactional( propagation = Propagation.NEVER )
  public Utilisateur tryLogUser(String loggin, String password) throws Exception {
 
    Utilisateur u = getDao().findUtilisateurByLogginAndPassword(loggin, password);
 
    if ( u == null ) {
      throw new UserCredentialsIncorrectException(loggin, password);
    }
 
    if(!u.getNeutralise()){
      throw new UserNotActiveException(loggin);
    }
 
    return u;
  }
 
}
Voilà et lorsque la connexion est perdue, une exception est envoyée (jusque-là tout va bien), je reconnecte le réseau et la même exception est lancée, je suis obligé de redémarrer le serveur (en production chez le client ça fait désordre …) :

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 
 
 org.springframework.orm.jpa.JpaSystemException: Error while committing the transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
	at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:326) [org.springframework.orm_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:106) [org.springframework.orm_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization.convertException(ExtendedEntityManagerCreator.java:501) [org.springframework.orm_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization.afterCommit(ExtendedEntityManagerCreator.java:481) [org.springframework.orm_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.transaction.support.TransactionSynchronizationUtils.invokeAfterCommit(TransactionSynchronizationUtils.java:133) [org.springframework.transaction_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerAfterCommit(TransactionSynchronizationUtils.java:121) [org.springframework.transaction_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCommit(AbstractPlatformTransactionManager.java:950) [org.springframework.transaction_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:796) [org.springframework.transaction_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) [org.springframework.transaction_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393) [org.springframework.transaction_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) [org.springframework.transaction_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) [org.springframework.aop_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) [org.springframework.aop_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at $Proxy68.clearChangings(Unknown Source)	at com.****.userSession.UserSessions.logUserForDebug(UserSessions.java:205) [****-Libraries.jar:]
	at com.****.libraries.initiators.Initiator.onDebugDetected(Initiator.java:85) [*****-Libraries.jar:]
	at com.****.libraries.initiators.Initiator.doInit(Initiator.java:49) [***-Libraries.jar:]
	at org.zkoss.zk.ui.metainfo.InitiatorInfo.doInit(InitiatorInfo.java:148) [zk.jar:6.0.1]
	at org.zkoss.zk.ui.metainfo.InitiatorInfo.newInitiator(InitiatorInfo.java:143) [zk.jar:6.0.1]
	at org.zkoss.zk.ui.metainfo.PageDefinition.doInit(PageDefinition.java:379) [zk.jar:6.0.1]
	at org.zkoss.zk.ui.impl.Initiators.doInit(Initiators.java:58) [zk.jar:6.0.1]
	at org.zkoss.zk.ui.impl.UiEngineImpl.execNewPage0(UiEngineImpl.java:382) [zk.jar:6.0.1]
	at org.zkoss.zk.ui.impl.UiEngineImpl.execNewPage(UiEngineImpl.java:316) [zk.jar:6.0.1]
	at org.zkoss.zk.ui.http.DHtmlLayoutServlet.process(DHtmlLayoutServlet.java:215) [zk.jar:6.0.1]
	at org.zkoss.zk.ui.http.DHtmlLayoutServlet.doGet(DHtmlLayoutServlet.java:135) [zk.jar:6.0.1]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
	at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:147) [org.springframework.orm_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) [org.springframework.web_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
	at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
	at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
	at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_03]
Caused by: javax.persistence.RollbackException: Error while committing the transaction
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:90) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
	at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization.afterCommit(ExtendedEntityManagerCreator.java:478) [org.springframework.orm_3.1.1.RELEASE.jar:3.1.1.RELEASE]
	... 41 more
Caused by: javax.persistence.PersistenceException: org.hibernate.TransactionException: commit failed
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1361) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1289) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:78) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
	... 42 more
Caused by: org.hibernate.TransactionException: commit failed
	at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:185) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:73) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
	... 42 more
Caused by: org.hibernate.TransactionException: unable to commit against JDBC connection
	at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:116) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
	at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:178) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
	... 43 more
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: La connexion est fermée.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:304)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.commit(SQLServerConnection.java:1641)
	at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.jdbcCommit(BaseWrapperManagedConnection.java:986)
	at org.jboss.jca.adapters.jdbc.WrappedConnection.commit(WrappedConnection.java:757)
	at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:112) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
	... 44 more
Merci beaucoup d’avance pour votre aide.