다중 Transaction 처리 문의
- 작성자 :
- 김*규
- 작성일 :
- 2014-06-26 10:02:27
- 조회수 :
- 2,086
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
여러개의 datasource를 설정 한 뒤
annotaion Transaction을 이용하기위해 아래와 같이 설정했습니다
<tx:annotation-driven transaction-manager="tsManager1" />
<bean id="tsManager1" class="org.springframework.jdbc.datasource.DatasourceTransactionManager">
<property name="dataSource" ref="dataSource1" />
</bean>
<bean id="tsManager2" class="org.springframework.jdbc.datasource.DatasourceTransactionManager">
<property name="dataSource" ref="dataSource2" />
</bean>
그리고 context-sqlMap.xml에서
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource ref="dataSource1" />
<property name="mapperLocations value="classpath:/egovframework/sqlmap/sql/**/*.xml" />
</bean>
<bean id="sqlSession2" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource ref="dataSource2" />
<property name="mapperLocations value="classpath:/egovframework/sqlmap/sql/**/*.xml" />
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSession" />
</bean>
<bean id="sqlSessionTemplate2" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSession2" />
</bean>
<bean id="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
<property name="basePackage" value="egovframework.**.mapper" />
</bean>
으로 설정했습니다
제가 mybatis mapper interface를 이용 했는데 serviceimpl 쪽에서 @Transactional 을 선언하여
다중 트랜잭션을 구현 하려고 합니다
각각의 트랜잭션은 다른 datasource를 참조하여 다른 db로붙습니다.
이를 수행하기 위해서 어떤 설정을 더 해줘야 할지요
현재는 @Transactional(value="tsManager2")
라고 선언해줘도 무조껀 dataSource1의 정보로만 붙습니다 ㅠㅠ
annotaion Transaction을 이용하기위해 아래와 같이 설정했습니다
<tx:annotation-driven transaction-manager="tsManager1" />
<bean id="tsManager1" class="org.springframework.jdbc.datasource.DatasourceTransactionManager">
<property name="dataSource" ref="dataSource1" />
</bean>
<bean id="tsManager2" class="org.springframework.jdbc.datasource.DatasourceTransactionManager">
<property name="dataSource" ref="dataSource2" />
</bean>
그리고 context-sqlMap.xml에서
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource ref="dataSource1" />
<property name="mapperLocations value="classpath:/egovframework/sqlmap/sql/**/*.xml" />
</bean>
<bean id="sqlSession2" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource ref="dataSource2" />
<property name="mapperLocations value="classpath:/egovframework/sqlmap/sql/**/*.xml" />
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSession" />
</bean>
<bean id="sqlSessionTemplate2" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSession2" />
</bean>
<bean id="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
<property name="basePackage" value="egovframework.**.mapper" />
</bean>
으로 설정했습니다
제가 mybatis mapper interface를 이용 했는데 serviceimpl 쪽에서 @Transactional 을 선언하여
다중 트랜잭션을 구현 하려고 합니다
각각의 트랜잭션은 다른 datasource를 참조하여 다른 db로붙습니다.
이를 수행하기 위해서 어떤 설정을 더 해줘야 할지요
현재는 @Transactional(value="tsManager2")
라고 선언해줘도 무조껀 dataSource1의 정보로만 붙습니다 ㅠㅠ
A
안녕하세요. 김민규님.
다중 transaction이시라는 의미가 global transaction을 말씀하신 경우라면 JTA를 통한 별도의 transaction 관리가 필요합니다.
다만, 김민규님의 질문 내용을 보면 다중 transaction이 아닌 multi datasource 사용을 문의하신 것 같으신데,
이 경우라면
<bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
<property name="basePackage" value="egovframework.part1.**.mapper" />
</bean>
<bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
<property name="basePackage" value="egovframework.part2.**.mapper" />
<property name="sqlSessionFactoryBeanName="sqlSession2" />
</bean>
와 같이 "sqlSession" id가 아닌 다른 id를 sqlSessionFactoryBeanName으로 지정하시면 됩니다.
다만, 이 경우는 basePackage 부분을 서로 중복되지 않게 정의하셔야 하며, mapper interface의 패키지 위치에 따라 다른 dataSource를 호출하도록 되어 있음을 인지해 주시면 되실 것 같습니다.
그럼, 즐거운 하루되십시오.
감사합니다.
다중 transaction이시라는 의미가 global transaction을 말씀하신 경우라면 JTA를 통한 별도의 transaction 관리가 필요합니다.
다만, 김민규님의 질문 내용을 보면 다중 transaction이 아닌 multi datasource 사용을 문의하신 것 같으신데,
이 경우라면
<bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
<property name="basePackage" value="egovframework.part1.**.mapper" />
</bean>
<bean class="egovframework.rte.psl.dataaccess.mapper.MapperConfigurer">
<property name="basePackage" value="egovframework.part2.**.mapper" />
<property name="sqlSessionFactoryBeanName="sqlSession2" />
</bean>
와 같이 "sqlSession" id가 아닌 다른 id를 sqlSessionFactoryBeanName으로 지정하시면 됩니다.
다만, 이 경우는 basePackage 부분을 서로 중복되지 않게 정의하셔야 하며, mapper interface의 패키지 위치에 따라 다른 dataSource를 호출하도록 되어 있음을 인지해 주시면 되실 것 같습니다.
그럼, 즐거운 하루되십시오.
감사합니다.