2014-06-18 2 views
0

두 개의 다른 데이터베이스 인스턴스를 처리하는 프로젝트가 있습니다. 데이터베이스에 대한 각 액세스는 트랜잭션이지만 database1의 트랜잭션은 database2의 트랜잭션에 링크 할 필요가 없습니다.두 개의 다른 세션에 대해 두 개의 최대 절전 모드 transactionManager를 구성하는 방법

나는 Hibernate와 spring-tx 4.0.3 Release, spring Ioc4와 hibernate4를 사용하고있다.

내 DAO 서비스에 @Transactional 주석을 사용합니다.

그래서 두 개의 데이터 소스 빈, 두 개의 sessionFactory 빈과 두 개의 HibernateTransactionManager 빈을 설정한다.

TransactionAspectSupport.determineTransactionManagerPlatformTransactionManager 인터페이스를 구현하는 클래스 인스턴스를 하나만 찾으려고하므로 UniqueBeanException이 표시됩니다.

내 Java 구성 클래스가 TransactionManagementConfigurer을 구현할 수 있음을 알았 기 때문에 사용할 트랜잭션 관리자 빈을 구체적으로 알 수 있었고 ProxyTransactionManager을 구현하여 각 해당 트랜잭션 관리자에 위임 할 수있었습니다. 데이터베이스에서 현재 호출을 수행해야합니다.

문제는 이러한 ProxyPlatformTransactionManager 방법을 구현하고 있으며, 어떤 데이터베이스가 액세스되고 있는지 또는 어떤 SessionFactory에 액세스하고 있는지 알 수 있습니까? 그렇지 않으면 어떤 PlatformTransactionManager을 사용해야할지 모릅니다.

그런 유형의 문제에 아직 직면 한 사람이 있습니까?

감사합니다,

멜 응용 프로그램의 맥락에서

+0

을 한정자를 사용하여 코드에서 여러 sessionFactories에 액세스 할 수 있습니다 docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html # value--) 관리자는 tx 관리자가 적용되며 봄은 사용자를 위해 수행 할 것입니다. 추가 수업이 필요 없습니다. –

+0

감사합니다 Deinum, 나는 그것에 대해 생각해 보았습니다 :)하지만 불행히도, 내 Hibernate 객체 중 일부는 일부 jar 라이브러리에 정의되어 있습니다. 그래서이 접근법을 사용한다면 적절한 tx 관리자를 입력하기 위해 모든 클래스를 해킹해야합니다. 기본 tx 관리자를 bean 중 하나로 설정하는 방법이 없으면 어쩌면? – Melanie

답변

1

, 당신은 당신의 DAO/서비스로 거래 예선을

<bean id="txMngr1" class="org.springframework.orm.hibernate5.HibernateTransactionManager" 
      p:sessionFactory-ref="sessionFactory1"> 
    <qualifier value="txMngr1"/> 
</bean> 
<bean id="txMngr2" class="org.springframework.orm.hibernate5.HibernateTransactionManager" 
      p:sessionFactory-ref="sessionFactory2"> 
    <qualifier value="txMngr2"/> 
</bean> 

다음과 같이 2 transactionalManagers을 정의한 후 사용해야합니다.

@Transactional("txMngr2") 

참고 : 당신은 단순히 [Transactional` @`]을 (http://docs.spring.io/spring/에서 지정한뿐만 아니라

@Autowired 
@Qualifier(value="sessionFactory2") 
private SessionFactory sessionFactory; 
관련 문제