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 :

gestion de plusieurs base de données en Spring


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 144
    Par défaut gestion de plusieurs base de données en Spring
    Bonjour,

    je vous explique clairement mon problème car maintenant que le périmètre de mon application est bien cerné j'ai besoin de conseils.

    J'ai mis en place une architecture Struts2 + Spring 2.5.3.

    Mon problème est que je vais avoir plsuieurs base de données à utiliser :
    - 1 en lecture/ecriture
    - 1 en lecture
    - 1 en ecriture

    Ce qui ferait donc 3 datasources différents.

    D'après vous, quel serait le meilleur moyen pour realiser cela en toute sécurité ?

    J'avais pensé créer plusieurs EntityManager, TransactionManager, et DataSource mais je ne sais pas si cela est une idée réaliste.

    Merci pour vos conseils avisés !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 144
    Par défaut
    J'ai lu ça dans la doc :

    Both TransactionTemplate and TransactionInterceptor delegate the actual transaction handling to a
    PlatformTransactionManager instance, which can be a HibernateTransactionManager (for a single
    Hibernate SessionFactory, using a ThreadLocal Session under the hood) or a JtaTransactionManager
    (delegating to the JTA subsystem of the container) for Hibernate applications. You could even use a custom
    PlatformTransactionManager implementation. So switching from native Hibernate transaction management to
    JTA, such as when facing distributed transaction requirements for certain deployments of your application, is
    just a matter of configuration. Simply replace the Hibernate transaction manager with Spring's JTA transaction
    implementation. Both transaction demarcation and data access code will work without changes, as they just use
    the generic transaction management APIs.

    For distributed transactions across multiple Hibernate session factories, simply combine
    JtaTransactionManager as a transaction strategy with multiple LocalSessionFactoryBean definitions. Each
    of your DAOs then gets one specific SessionFactory reference passed into it's respective bean property. If all
    underlying JDBC data sources are transactional container ones, a business service can demarcate transactions
    across any number of DAOs and any number of session factories without special regard, as long as it is using
    JtaTransactionManager as the strategy
    Ce qui est interressant est le deuxième paragraphe, mais je ne suis pas sur de bien comprendre lorsque je traduit en français. Ce que je comprend c'est que lorsque l'on doit effectuer des transactions distribuées (donc sur plusieurs bases de données en utilisant plusieurs SessionFactory Hibernate, on doit utiliser un JtaTransactionManager. Ensuite, chacun des DAO recoit une reference sur la SessionFactory dont il a besoin. Si les datasources gère l'aspect transactionnel, un service métier peut (et c'est la où je ne comprend pas trop) "séparer" les transactions sur sur autant de DAO et SessionFactory voulu, tant que JtaTransactionManager est utilisé.

    Voilà le code associé en tant qu'exemple :

    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
    <beans>
    <bean id="myDataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName value="java:comp/env/jdbc/myds1"/>
    </bean>
    <bean id="myDataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/myds2"/>
    </bean>
    <bean id="mySessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource1"/>
    <property name="mappingResources">
    <list>
    <value>product.hbm.xml</value>
    </list>
    </property>
    <property name="hibernateProperties">
    <value>
    hibernate.dialect=org.hibernate.dialect.MySQLDialect
    hibernate.show_sql=true
    </value>
    </property>
    </bean>
    <bean id="mySessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource2"/>
    <property name="mappingResources">
    <list>
    <value>inventory.hbm.xml</value>
    </list>
    </property>
    <property name="hibernateProperties">
    <value>
    hibernate.dialect=org.hibernate.dialect.OracleDialect
    </value>
    </property>
    </bean>
    <bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
    <bean id="myProductDao" class="product.ProductDaoImpl">
    <property name="sessionFactory" ref="mySessionFactory1"/>
    </bean>
    <bean id="myInventoryDao" class="product.InventoryDaoImpl">
    <property name="sessionFactory" ref="mySessionFactory2"/>
    </bean>
    <!-- this shows the Spring 1.x style of declarative transaction configuration -->
    <!-- it is totally supported, 100% legal in Spring 2.x, but see also above for the sleeker, Spring 2.0 style -->
    <bean id="myProductService"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="myTxManager"/>
    <property name="target">
    <bean class="product.ProductServiceImpl">
    <property name="productDao" ref="myProductDao"/>
    <property name="inventoryDao" ref="myInventoryDao"/>
    </bean>
    </property>
    <property name="transactionAttributes">
    <props>
    <prop key="increasePrice*">PROPAGATION_REQUIRED</prop>
    <prop key="someOtherBusinessMethod">PROPAGATION_REQUIRES_NEW</prop>
    <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
    </props>
    </property>
    </bean>
    Alors si je resume :
    - on a 2 DAO
    - chaque DAO utilise une SessionFactory particulière (donc un datasource particulier)
    - on a 1 service qui est du type TransactionProxyFactoryBean (j'imagine que l'on doit etendre cette classe pour créer nos service), dans lequel sont injectés les 2 DAO précédents, + le JtaTransactionManager

    Ma question est la suivante :
    Si l'un des 2 Dao plante (mettons qu'une des bases tombe) dans une des méthode de notre service (l'un s'éxecute et au moment d'utiliser l'autre la base n'est plus disponible), est ce que tout sera rollbacké ?

    Je sais que c'est un peu long et compliqué mais j'aimerais bien avoir votre avis

    Merci !!

  3. #3
    Membre confirmé Avatar de austin P.
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Par défaut
    tu dois utiliser un JTA transaction manager
    perso j'ai fais le choix d'atomikos et ça marche super
    si une des datasources est déféctueuse ou en setRollbackOnly, l'ensemble des opérations est rollbacké

    bon courage

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 144
    Par défaut
    bonjour,

    Merci pour ta réponse.

    Finalement j'utilise JOTM 2.0.10 avec spring/tomcat (j'ai bien galléré pour intégrer tout ca d'ailleurs...)

    J'uilise donc un jta transaction manager.
    J'espère que cela fonctionne aussi bien qu'atomikos

    Juste pour être certain a 100% de mon archi, tu peux me confirmer qu'atomikos est un equivalent de JOTM ? (et vice versa)
    J'ai peu confiance en fait dans mon appli là

    Merci

  5. #5
    Membre confirmé Avatar de austin P.
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Par défaut
    oui

    atomikos et jotm sont des TransactionManager JTA

    cependant j'ai utilisé JOTM au départ mais après plusieurs déconvenues et vues que l'activité de ce projet est bien moindre qu'atomikos, j'ai décidé d'abandonner jotm au profit d'atomikos.

    bon courage

Discussions similaires

  1. [AC-2010] Gestion d'une base de données à plusieurs
    Par ZoliveR dans le forum Access
    Réponses: 8
    Dernier message: 09/12/2011, 19h52
  2. Réponses: 9
    Dernier message: 03/11/2011, 15h26
  3. Gestion de plusieurs bases de données
    Par M_Torres dans le forum Accès aux données
    Réponses: 2
    Dernier message: 24/02/2007, 11h29
  4. connexion a plusieurs bases de données oracle
    Par tarik75 dans le forum JDBC
    Réponses: 1
    Dernier message: 06/07/2005, 13h33
  5. triggers sur plusieurs bases de données
    Par Shabata dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2004, 10h02

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