멀티 DBMS설정시 트랜젝션메니져 처리
- 작성자 :
- 송*영
- 작성일 :
- 2012-10-25 23:05:26
- 조회수 :
- 2,692
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
안녕하세요 바쁘신데 죄송합니다.
훌륭한 프레임워크를 제공해 주셔서 많은 프로젝트를 하는 사람들에게 많은 도움을 주시느라 바쁘실텐데요... 트랜젝션 관련해서 문의좀 하겠습니다.
여기 게시글을 뒤져보니 다수 DBMS 설정시
Mssql, Oracle 등 다수의 DBMS 설정시
1. dataSource 추가
2. sqlMapClient 추가
3. EgovAbstractDAO를 상속받는 여러 개의 DAO 추가
4. 업무 DAO 생성
5. 끝으로 transaction 부분이 문제이나 이 부분은 transactionManager를 변경해야함. 구체적인 부분은 WAS 벤더쪽에 문의를 해야함
많이 생략했지만 대략 이리 하라고 답변이 되어 있더군요.
그런데 저 트랜젝션메니져 부분이 궁금합니다. 전자정부프래임워크의
템플릿으로 생성된 context-transaction.xml 파일을 열어보니
내용이
<!-- transaction 설정 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="requiredTx"
expression="execution(* egovframework.let..impl.*Impl.*(..)) or execution(* egovframework.com..*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice"
pointcut-ref="requiredTx" />
</aop:config>
이러 하던데 이걸 수정해야 하는건지요 수정한다면 어떻게 하면 될지
아니면 다른 설정으로 새로 파일을 만들어야 할지요...
답변 부타드립니다.
감사합니다.
훌륭한 프레임워크를 제공해 주셔서 많은 프로젝트를 하는 사람들에게 많은 도움을 주시느라 바쁘실텐데요... 트랜젝션 관련해서 문의좀 하겠습니다.
여기 게시글을 뒤져보니 다수 DBMS 설정시
Mssql, Oracle 등 다수의 DBMS 설정시
1. dataSource 추가
2. sqlMapClient 추가
3. EgovAbstractDAO를 상속받는 여러 개의 DAO 추가
4. 업무 DAO 생성
5. 끝으로 transaction 부분이 문제이나 이 부분은 transactionManager를 변경해야함. 구체적인 부분은 WAS 벤더쪽에 문의를 해야함
많이 생략했지만 대략 이리 하라고 답변이 되어 있더군요.
그런데 저 트랜젝션메니져 부분이 궁금합니다. 전자정부프래임워크의
템플릿으로 생성된 context-transaction.xml 파일을 열어보니
내용이
<!-- transaction 설정 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="requiredTx"
expression="execution(* egovframework.let..impl.*Impl.*(..)) or execution(* egovframework.com..*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice"
pointcut-ref="requiredTx" />
</aop:config>
이러 하던데 이걸 수정해야 하는건지요 수정한다면 어떻게 하면 될지
아니면 다른 설정으로 새로 파일을 만들어야 할지요...
답변 부타드립니다.
감사합니다.
A
안녕하세요.. 송준영님..
여러 DBMS를 하나의 트랙잭션으로 묶으려면.. JTA(Java Transation API)를 사용해야 합니다.
즉, WAS나 별도로 JTA를 지원하는 SW(오픈소스로는 JTOM이 있음)가 필요합니다.
WAS마다 방식에 차이가 있을 수 있지만, 일반적으로 WAS의 경우는 WAS 상에 묶고자 하는 DBMS의 연결 정보들을 DataSource로 등록하고..
JTATransactionManager를 JNDI lookup을 통해 가져오면 됩니다..
예)
WebLogic의 경우는 다음 WebLogicJtaTransactionManager를 기존 DataSourceTransactionManager 대신 사용하시면 됩니다.
http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/transaction/jta/WebLogicJtaTransactionManager.html
JEUS의 경우는 Spring에서 제공하는 JtaTransactionManager가 없어서..
템플릿 references 디렉토리 상에 JEUS JTA Settings.txt 파일을 넣어놓았습니다.
(아래 내용 참조)
1. DataSource 설정 (JEUSMain.xml)
2. DataSource 설정 (context-datasource.xml)
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="dsName" />
</bean>
<!-- 여러 DataSource를 사용하는 경우 여러 개 지정 -->
3. JTA Transaction 설정 (context-transaction.xml)
<bean id="JtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="java:/TransactionManager" />
<property name="jndiTemplate" ref="jnditemplate"></property>
</bean>
<bean id="jnditemplate" class="org.springframework.jndi.JndiTemplate" >
<property name="environment">
<props>
<prop key="java.naming.factory.initial">jeus.jndi.JNSContextFactory</prop>
<prop key="java.naming.provider.url">127.0.0.1:9736</prop>
</props>
</property>
</bean>
4. txManager 지정 (context-transaction.xml)
* Annotation 방식
<tx:annotation-driven transaction-manager="JtaTransactionManager"/>
* AOP 방식
<tx:advice id="txAdvice" transaction-manager="JtaTransactionManager">
...
</tx:advice>
5. 기타
JEUS Server는 별도 설정없이도 기본적인 TransactionManager를 가지고 있으며
해당 TransactionManager의 JNDI명은 java:/TransactionManager입니다.
JNDI명이 java:/TransactionManager인 TransactionManager를 찾지 못해 javax.naming.NameNotFoundException이 발생하였다면
해당 프로젝트 내에 j2ee-x.x.jar 파일이 추가되어 있지 않은지 확인하여 삭제하도록 합니다.
이는 JEUS Server를 위한 기본 라이브러리 내에 존재하는 Transaction 처리 관련 클래스와 충돌로 인해 발생하는 문제이기 때문입니다.
그럼.. 즐거운 하루되십시오.
감사합니다.
여러 DBMS를 하나의 트랙잭션으로 묶으려면.. JTA(Java Transation API)를 사용해야 합니다.
즉, WAS나 별도로 JTA를 지원하는 SW(오픈소스로는 JTOM이 있음)가 필요합니다.
WAS마다 방식에 차이가 있을 수 있지만, 일반적으로 WAS의 경우는 WAS 상에 묶고자 하는 DBMS의 연결 정보들을 DataSource로 등록하고..
JTATransactionManager를 JNDI lookup을 통해 가져오면 됩니다..
예)
WebLogic의 경우는 다음 WebLogicJtaTransactionManager를 기존 DataSourceTransactionManager 대신 사용하시면 됩니다.
http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/transaction/jta/WebLogicJtaTransactionManager.html
JEUS의 경우는 Spring에서 제공하는 JtaTransactionManager가 없어서..
템플릿 references 디렉토리 상에 JEUS JTA Settings.txt 파일을 넣어놓았습니다.
(아래 내용 참조)
1. DataSource 설정 (JEUSMain.xml)
2. DataSource 설정 (context-datasource.xml)
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="dsName" />
</bean>
<!-- 여러 DataSource를 사용하는 경우 여러 개 지정 -->
3. JTA Transaction 설정 (context-transaction.xml)
<bean id="JtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="java:/TransactionManager" />
<property name="jndiTemplate" ref="jnditemplate"></property>
</bean>
<bean id="jnditemplate" class="org.springframework.jndi.JndiTemplate" >
<property name="environment">
<props>
<prop key="java.naming.factory.initial">jeus.jndi.JNSContextFactory</prop>
<prop key="java.naming.provider.url">127.0.0.1:9736</prop>
</props>
</property>
</bean>
4. txManager 지정 (context-transaction.xml)
* Annotation 방식
<tx:annotation-driven transaction-manager="JtaTransactionManager"/>
* AOP 방식
<tx:advice id="txAdvice" transaction-manager="JtaTransactionManager">
...
</tx:advice>
5. 기타
JEUS Server는 별도 설정없이도 기본적인 TransactionManager를 가지고 있으며
해당 TransactionManager의 JNDI명은 java:/TransactionManager입니다.
JNDI명이 java:/TransactionManager인 TransactionManager를 찾지 못해 javax.naming.NameNotFoundException이 발생하였다면
해당 프로젝트 내에 j2ee-x.x.jar 파일이 추가되어 있지 않은지 확인하여 삭제하도록 합니다.
이는 JEUS Server를 위한 기본 라이브러리 내에 존재하는 Transaction 처리 관련 클래스와 충돌로 인해 발생하는 문제이기 때문입니다.
그럼.. 즐거운 하루되십시오.
감사합니다.