2개 이상의 Datasource 설정시 질문
- 작성자 :
- 장*주
- 작성일 :
- 2010-10-14 12:07:47
- 조회수 :
- 3,400
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
안녕하세요..
2개 이상의 Datasource 설정시 질문들이 있습니다..
우선 게시판의 여러 자료를 봤는데요... 그래도 풀리지 않는 의문이 있습니다.
1. 여러개의 Datasource를 만든 후에 각각의 DAO에서 아래와 같이 sqlMapClient를
지정하게 되는데요..
@Resource(name = "OtherSqlMapClient")
public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
super.setSuperSqlMapClient(sqlMapClient);
}
제가 궁금한거는... 2개의 Datasource중에 어떤거는 거의 메인급으로 많은곳에서
사용이 되지만 다른 하나는 사용하는 DAO가 별로 없다고 했을때...
모든 DAO에 저렇게 선언하는게 불편한것 같습니다.. 그래서 어떤거를 Default로
설정을 해서 sqlMapClient를 지정하지 않으면 Default로 설정한 sqlMapClient
가 설정되게 할수 있는 방법은 없는건가요???
다른 sqlMapClient가 필요한 경우에만 저렇게 지정하구요...
2. 2개 이상의 Datasource 설정시 트랜잭션의 문제 입니다...
만약 하나의 Service 는 무조건 같은 Datasource와 연결된 여러개의 Dao를
호출 한다고 할 경우에 트랜잭션은 어떻게 설정을 해야 하나요???
즉, AService 는 DataSource1 과 BService는 Datasource2 와 연결된 Dao
만과 연결된다고 할경우에요...
제가 생각 했을때는 해당 Datasource 별로 트랜잭션도 두개를 만들어야 할거
같은데 만약 2개를 만들었다면 어떻게 트랜잭션을 걸어야 할지 모르겠네요...
어떤 특정 Service가 트랙잭션을 걸려고 보니 AOP expression 설정부분을
보니 두개의 트랜잭션에 다 포함 될 경우 Service단에서는 어떤 트랜잭션을
사용해야 할지 모를거 같은데요...
아니면 아래와 같이 하나의 트랜잭션 메니져에 여러개의 Datasource를 설정 할수
있는 건지는 모르겠지만 저렇게 된다고 하면 Service 단에서는 두개의
Datasource에 대해서 동시에 트랜잭션을 거는 건지요??
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource1" ref="dataSource1"/>
<property name="dataSource2" ref="dataSource2"/>
</bean>
3. 마지막으로 2번과 좀 연관성이 있는데요...
만약 하나의 Service 가 서로다른 Datasource와 연결된 여러개의 Dao를
호출 한다고 할 경우에 트랜잭션은 어떻게 설정을 해야 하나요???
2개 이상의 Datasource 설정시 질문들이 있습니다..
우선 게시판의 여러 자료를 봤는데요... 그래도 풀리지 않는 의문이 있습니다.
1. 여러개의 Datasource를 만든 후에 각각의 DAO에서 아래와 같이 sqlMapClient를
지정하게 되는데요..
@Resource(name = "OtherSqlMapClient")
public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
super.setSuperSqlMapClient(sqlMapClient);
}
제가 궁금한거는... 2개의 Datasource중에 어떤거는 거의 메인급으로 많은곳에서
사용이 되지만 다른 하나는 사용하는 DAO가 별로 없다고 했을때...
모든 DAO에 저렇게 선언하는게 불편한것 같습니다.. 그래서 어떤거를 Default로
설정을 해서 sqlMapClient를 지정하지 않으면 Default로 설정한 sqlMapClient
가 설정되게 할수 있는 방법은 없는건가요???
다른 sqlMapClient가 필요한 경우에만 저렇게 지정하구요...
2. 2개 이상의 Datasource 설정시 트랜잭션의 문제 입니다...
만약 하나의 Service 는 무조건 같은 Datasource와 연결된 여러개의 Dao를
호출 한다고 할 경우에 트랜잭션은 어떻게 설정을 해야 하나요???
즉, AService 는 DataSource1 과 BService는 Datasource2 와 연결된 Dao
만과 연결된다고 할경우에요...
제가 생각 했을때는 해당 Datasource 별로 트랜잭션도 두개를 만들어야 할거
같은데 만약 2개를 만들었다면 어떻게 트랜잭션을 걸어야 할지 모르겠네요...
어떤 특정 Service가 트랙잭션을 걸려고 보니 AOP expression 설정부분을
보니 두개의 트랜잭션에 다 포함 될 경우 Service단에서는 어떤 트랜잭션을
사용해야 할지 모를거 같은데요...
아니면 아래와 같이 하나의 트랜잭션 메니져에 여러개의 Datasource를 설정 할수
있는 건지는 모르겠지만 저렇게 된다고 하면 Service 단에서는 두개의
Datasource에 대해서 동시에 트랜잭션을 거는 건지요??
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource1" ref="dataSource1"/>
<property name="dataSource2" ref="dataSource2"/>
</bean>
3. 마지막으로 2번과 좀 연관성이 있는데요...
만약 하나의 Service 가 서로다른 Datasource와 연결된 여러개의 Dao를
호출 한다고 할 경우에 트랜잭션은 어떻게 설정을 해야 하나요???
A
안녕하세요.. 장선주님..
다음과 같이 답변 드립니다.
1. SqlMapClient를 @Resource를 통해 Inject하는 경우는 각 DAO가 아닌 상위 클래스입니다. 즉.. 매 DAO마다 적어주신 setSuperSqlMapClient() 메소드를 적용하시는 것이 아니라 DataSource 마다 상위 클래스가 있는 형태입니다.
DAO는 필요한 상위 클래스를 상속하시면 됩니다.
저희 실행환경의 경우 EgovAbstractDAO가 있는데.. 이 클래스를 직접 상속하시는 경우는 자동으로 sqlMapClient를 injection 하도록 되어 있습니다.
일반적인 경우는 그냥 EgovAbstractDAO를 상속하시면 되고..
필요한 경우에 다른 EgovOtherAbstractDAO를 만드셔서 상속하시면 됩니다. (이 AbstractDOA에 setSuperSqlMapClient 메소드가 있음)
2. 우선.. 하나의 Service는 하나의 DAO만을 호출하진 않습니다.
즉 Service에서 여러 DAO를 호출할 수 있고, 여러 DAO가 여러 DataSource를 호출하는 방식입니다.
그러나.. 이때 Transaction(2PC commit)을 보장하기 위해서는 JTA를 지원하는 WAS가 필요합니다. (DB들도 2PC commit을 지원해야 함..)
이 경우는 위의 DatasSourceTransactionManager를 사용하실 수 없습니다. (이 TM의 경우는 하나의 datasource만 지원)
설정 방법은.. DataSource를 WAS에서 생성 후.. WAS에서 제공하는 TransactionManager만 등록하시면 바로 적용됩니다. (대부분의 WAS의 경우이고.. WAS별로 다른 방법으로 적용될 수 있으니 해당 WAS 벤더에 문의하시면 됩니다.)
참고로 JEUS의 경우 TransactoinManager는 다음과 같이 등록하시면 됩니다.
<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>
3. 위 2번을 참조하십시오.
그럼.. 즐거운 하루되십시오.
감사합니다.
다음과 같이 답변 드립니다.
1. SqlMapClient를 @Resource를 통해 Inject하는 경우는 각 DAO가 아닌 상위 클래스입니다. 즉.. 매 DAO마다 적어주신 setSuperSqlMapClient() 메소드를 적용하시는 것이 아니라 DataSource 마다 상위 클래스가 있는 형태입니다.
DAO는 필요한 상위 클래스를 상속하시면 됩니다.
저희 실행환경의 경우 EgovAbstractDAO가 있는데.. 이 클래스를 직접 상속하시는 경우는 자동으로 sqlMapClient를 injection 하도록 되어 있습니다.
일반적인 경우는 그냥 EgovAbstractDAO를 상속하시면 되고..
필요한 경우에 다른 EgovOtherAbstractDAO를 만드셔서 상속하시면 됩니다. (이 AbstractDOA에 setSuperSqlMapClient 메소드가 있음)
2. 우선.. 하나의 Service는 하나의 DAO만을 호출하진 않습니다.
즉 Service에서 여러 DAO를 호출할 수 있고, 여러 DAO가 여러 DataSource를 호출하는 방식입니다.
그러나.. 이때 Transaction(2PC commit)을 보장하기 위해서는 JTA를 지원하는 WAS가 필요합니다. (DB들도 2PC commit을 지원해야 함..)
이 경우는 위의 DatasSourceTransactionManager를 사용하실 수 없습니다. (이 TM의 경우는 하나의 datasource만 지원)
설정 방법은.. DataSource를 WAS에서 생성 후.. WAS에서 제공하는 TransactionManager만 등록하시면 바로 적용됩니다. (대부분의 WAS의 경우이고.. WAS별로 다른 방법으로 적용될 수 있으니 해당 WAS 벤더에 문의하시면 됩니다.)
참고로 JEUS의 경우 TransactoinManager는 다음과 같이 등록하시면 됩니다.
<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>
3. 위 2번을 참조하십시오.
그럼.. 즐거운 하루되십시오.
감사합니다.