각기 다른 DB 계정을 부르는 DAO 작성
- 작성자 :
- 박*준
- 작성일 :
- 2011-12-07 14:20:53
- 조회수 :
- 2,408
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
<기존 질문>---------------------------------------------------
시스템 구성 상의 이유로 하나의 사이트에서
DB계정을 두 개로 접속해서 데이터를 가져오는 방식을 취하려 합니다.
한 화면에 두 계정의 데이터에 있는 내용을 같이 보이게 됩니다.
이 경우 계정 정보를 어떻게 설정하고 또 사용해야하는지 궁금합니다.
DBMS는 오라클 11g이고,
두 계정은 물리적으로 같은 DB시스템 안에 있습니다.
(즉 Globals.Uri는 같습니다.)
의견 부탁드립니다.
<기존 답변>---------------------------------------------------
context-datasource.xml
파일안에
<bean id="OtherDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:egovfrm" />
<property name="username" value="com"/>
<property name="password" value="com01"/>
</bean>
이라고 다른 아이디의 데이타 소스를 하나더 만드시고
context-sqlMap.xml
파일안에
<bean id="otherSqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocations">
<list>
<value>classpath:/sqlmap/config/*.xml</value>
</list>
</property>
<property name="dataSource" ref="OtherDataSource"/>
<property name="lobHandler" ref="lobHandler"/>
</bean>
이라고 작성하시면 일차적으로 두개의 계정을 쓸수있는 정의는 되었고
구현상에서 서비스 파일에서 각기 다른 계정의 내용을 부르는 DAO 를 각각 작성하셔서 부르면 됩니다.
단 컨트롤단을 두개로 만들경우 트랜젝션 처리가 되지 않는 케이스가 생기므로 주의하시기 바랍니다.
<새 질문>---------------------------------------------------
답변 감사드립니다.
두 XML 파일의 내용 수정은 이해되고 적용을 했습니다.
그런데 그 다음 "서비스 파일에서 각기 다른 계정의 내용을 부르는 DAO를 각각 작성하셔서 부르면"이 어떤 것을 말씀하는지 궁금합니다. DAO에서 계정을 선택한다는 게 어떤 말씀이신가요?
EgovComAbstractDAO를 복사해서 하나를 더 만들고 @Resource의 name을 context-sqlMap.xml에 새로 만든 bean의 id를 넣어서 테스트하고 있습니다.
공통 컴포넌트 소스를 기본으로 할때 어떤 부분을 응용해야할지 알려주시면 고맙겠습니다.
감사합니다.
시스템 구성 상의 이유로 하나의 사이트에서
DB계정을 두 개로 접속해서 데이터를 가져오는 방식을 취하려 합니다.
한 화면에 두 계정의 데이터에 있는 내용을 같이 보이게 됩니다.
이 경우 계정 정보를 어떻게 설정하고 또 사용해야하는지 궁금합니다.
DBMS는 오라클 11g이고,
두 계정은 물리적으로 같은 DB시스템 안에 있습니다.
(즉 Globals.Uri는 같습니다.)
의견 부탁드립니다.
<기존 답변>---------------------------------------------------
context-datasource.xml
파일안에
<bean id="OtherDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:egovfrm" />
<property name="username" value="com"/>
<property name="password" value="com01"/>
</bean>
이라고 다른 아이디의 데이타 소스를 하나더 만드시고
context-sqlMap.xml
파일안에
<bean id="otherSqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocations">
<list>
<value>classpath:/sqlmap/config/*.xml</value>
</list>
</property>
<property name="dataSource" ref="OtherDataSource"/>
<property name="lobHandler" ref="lobHandler"/>
</bean>
이라고 작성하시면 일차적으로 두개의 계정을 쓸수있는 정의는 되었고
구현상에서 서비스 파일에서 각기 다른 계정의 내용을 부르는 DAO 를 각각 작성하셔서 부르면 됩니다.
단 컨트롤단을 두개로 만들경우 트랜젝션 처리가 되지 않는 케이스가 생기므로 주의하시기 바랍니다.
<새 질문>---------------------------------------------------
답변 감사드립니다.
두 XML 파일의 내용 수정은 이해되고 적용을 했습니다.
그런데 그 다음 "서비스 파일에서 각기 다른 계정의 내용을 부르는 DAO를 각각 작성하셔서 부르면"이 어떤 것을 말씀하는지 궁금합니다. DAO에서 계정을 선택한다는 게 어떤 말씀이신가요?
EgovComAbstractDAO를 복사해서 하나를 더 만들고 @Resource의 name을 context-sqlMap.xml에 새로 만든 bean의 id를 넣어서 테스트하고 있습니다.
공통 컴포넌트 소스를 기본으로 할때 어떤 부분을 응용해야할지 알려주시면 고맙겠습니다.
감사합니다.
A
아래와 같이 하시면 됩니다. 수고하세요
package egovframework.rte.cmmn;
import javax.annotation.Resource;
import com.ibatis.sqlmap.client.SqlMapClient;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
public abstract class OneEgovAbstractDAO extends EgovAbstractDAO {
@Override
@Resource(name="SqlMapClient001")
public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
super.setSuperSqlMapClient(sqlMapClient);
}
}
package egovframework.rte.cmmn;
import javax.annotation.Resource;
import com.ibatis.sqlmap.client.SqlMapClient;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
public abstract class TwoEgovAbstractDAO extends EgovAbstractDAO {
@Override
@Resource(name="SqlMapClient002")
public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
super.setSuperSqlMapClient(sqlMapClient);
}
}
작성된 OneEgovAbstractDAO , TwoEgovAbstractDAO 상속 받은 DAO를 작성하여 활용하면 분산 트렌젝션을 사용가능
package egovframework.rte.cmmn;
import javax.annotation.Resource;
import com.ibatis.sqlmap.client.SqlMapClient;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
public abstract class OneEgovAbstractDAO extends EgovAbstractDAO {
@Override
@Resource(name="SqlMapClient001")
public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
super.setSuperSqlMapClient(sqlMapClient);
}
}
package egovframework.rte.cmmn;
import javax.annotation.Resource;
import com.ibatis.sqlmap.client.SqlMapClient;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
public abstract class TwoEgovAbstractDAO extends EgovAbstractDAO {
@Override
@Resource(name="SqlMapClient002")
public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
super.setSuperSqlMapClient(sqlMapClient);
}
}
작성된 OneEgovAbstractDAO , TwoEgovAbstractDAO 상속 받은 DAO를 작성하여 활용하면 분산 트렌젝션을 사용가능