IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Spring 3 - Jboss 7 - Hibernate 4 (JPA) - SQL SERVER - Reconnexion de la BDD en cas de perte du réseau


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut Spring 3 - Jboss 7 - Hibernate 4 (JPA) - SQL SERVER - Reconnexion de la BDD en cas de perte du réseau
    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.

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    As tu essayé de setter l’intervalle de validation des connexions du pool dans la définition de ta DS?

    Cela permet d'activer un thread daemon dont le rôle est de vérifier la validité des connexions du pool et de les rejerter suivant les cas.

    Par exemple pour qu'il tourne toutes les 2s:
    <background-validation-millis>2000</background-validation-millis>

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    Merci pour ta réponse. Mais j'ai le même problème :/.

    j'ai indiqué ça dans le standalone.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
    19
     
     
    <datasource jndi-name="java:jboss/datasources/MyDataSource" pool-name="MyPool" 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"/>
                            <background-validation-millis>2000</background-validation-millis>
                        </validation>
                    </datasource>
    Par contre j'ai un nouveau message quand je déconnecte le réseau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (http--0.0.0.0-8080-3) IJ000612: Destroying connection that could not be successfully matched: org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@26ff13d7[state=DESTROYED managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@346f9c41 connection handles=0 lastUse=1353487507748 trackByTx=false pool=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@68ed3942 pool internal context=SemaphoreArrayListManagedConnectionPool@2e4a51df[pool=MyPool] xaResource=LocalXAResourceImpl@b7b8a4c[connectionListener=26ff13d7 connectionManager=44e368df warned=false currentXid=null] txSync=null]

Discussions similaires

  1. Problème hibernate + types MS SQL Server 2008
    Par Aircraft dans le forum Hibernate
    Réponses: 0
    Dernier message: 22/09/2009, 13h20
  2. [Hibernate] Clob et SQL Server
    Par srvremi dans le forum Hibernate
    Réponses: 1
    Dernier message: 03/06/2006, 16h08
  3. SQL Server - arret d'une bdd
    Par topolino dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/04/2006, 13h54
  4. [JTDS][Hibernate] Connexion à un SQL Server distant
    Par Michel38 dans le forum Hibernate
    Réponses: 3
    Dernier message: 09/01/2006, 13h45
  5. [ hibernate 2.1 ] SQL server ... :(
    Par wizzmasta dans le forum Hibernate
    Réponses: 2
    Dernier message: 23/12/2005, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo