복붙노트

[SPRING] Spring에서 2 개의 다른 db로 작업하기 위해 트랜잭션 관리를 구성하는 방법은 무엇입니까?

SPRING

Spring에서 2 개의 다른 db로 작업하기 위해 트랜잭션 관리를 구성하는 방법은 무엇입니까?

2 개의 데이터베이스 (MySql 및 HSQLDB)가 있습니다. 나는 2 개의 데이터 소스와 2 개의 EntityManagerFactory 빈을 구성했다. 또한 2 개의 JpaTransactionManager 빈을 구성 할 수 있습니다.

그러나 구체적인 서비스 클래스에 대한 트랜잭션을 관리하는 데 사용해야하는 방법을 지정하는 방법을 알지 못합니다. 그 목적으로 @Transactional 어노테이션을 사용하고 싶지만 실제로 txManagers 중 하나만 지정할 수 있습니다.

<tx:annotation-driven transaction-manager="manager"/>

이 상황에서 벗어나는 방법은 무엇입니까?

해결법

  1. ==============================

    1.JpaTransactionManager에 대한 javadoc에는 이에 대한 몇 가지 조언이 있습니다.

    JpaTransactionManager에 대한 javadoc에는 이에 대한 몇 가지 조언이 있습니다.

    다시 말해, 여러 엔티티 관리자가 있고 해당 tx 관리자가있는 경우 단일 JtaTransactionManager를 사용하는 것이 좋습니다. 엔티티 관리자는 JTA 트랜잭션에 참여할 수 있어야하며, 이는 어느 한 엔티티 관리자에 대해 걱정하지 않고 두 엔티티 관리자간에 완전한 트랜잭션을 제공합니다.

    물론 JtaTransactionManager에는 Tomcat과 같은 바닐라 서블릿 엔진이 아닌 전체 JTA 지원 응용 프로그램 서버가 필요합니다.

  2. ==============================

    2. without transaction-manager 속성을 선언하고 다음과 같이 트랜잭션 관리자에 대한 한정자를 선언하십시오.

    without transaction-manager 속성을 선언하고 다음과 같이 트랜잭션 관리자에 대한 한정자를 선언하십시오.

    <bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <qualifier value="txManager1"/>
    </bean>
    

    @Transactional에서이 한정자를 값으로 사용하여 트랜잭션 관리자 중 하나를 선택합니다.

    @Transactional("txManager1")
    

    또는 더 많은 속성 :

    @Transactional(value = "txManager1", readOnly = true)   
    
  3. ==============================

    3.이후 정오 이후 오랫동안 정답.

    이후 정오 이후 오랫동안 정답.

    Skaffman은 여러 데이터베이스에 대한 JpaTransactionManager의 유용성면에서 정확할 수 있습니다.

    그러나 2 개의 다른 JpaTransactionManager를 가진 2 개의 다른 데이타베이스 사용을위한 작동 해결책이있다.

      @Bean(name = "db2TransactionManager")
      public PlatformTransactionManager transactionManager2() throws NamingException {
        JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
        return txManager;
      }
    
      @Bean
      @Primary
      public PlatformTransactionManager transactionManager() throws Exception {
         JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
        txManager.setNestedTransactionAllowed(true);
        return txManager;
      }
    

    @Primary는 @Transactional에 한정자 이름을 지정하지 않은 항목에 대해 지정해야합니다.

  4. ==============================

    4.application-context.xml에서 두 개의 트랜잭션 관리자를 아래와 같이 지정해야합니다.

    application-context.xml에서 두 개의 트랜잭션 관리자를 아래와 같이 지정해야합니다.

    <tx:annotation-driven transaction-manager="manager1"/>
    <tx:annotation-driven transaction-manager="manager2"/>
    

    @Transactional 속성은 관련 트랜잭션 관리자를 사용합니다.

  5. from https://stackoverflow.com/questions/1961566/how-to-configure-transaction-management-for-working-with-2-different-db-in-sprin by cc-by-sa and MIT license