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 :
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 <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>
J'utilise un OpenEntityManagerInViewFilter en plus de tout cela, j'ai essayé de le désactiver mais j'ai le même problème.
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>
Je paramètre mon persistence Unit comme suit :
J’injecte le persistence context comme suit dans mes DAO :
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’annote mes méthodes de mes services comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 @PersistenceContext( type = PersistenceContextType.EXTENDED ) protected EntityManager em;
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 @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; } }
Merci beaucoup d’avance pour votre aide.
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
Partager