여러개의 데이터소스 연결 및 개발 방법 샘플 요청
- 작성자 :
- 이*은
- 작성일 :
- 2015-04-23 11:53:47
- 조회수 :
- 1,377
- 구분 :
- 개발환경
- 진행상태 :
- 완료
Q
여러개의 DB를 연결하여 사용하려고 합니다.
1개는 트랜젝션을 관리해야 하고
나머지 DB는 select만 하면 되는 DB입니다.
그래서 context-datasource.xml, context-sqlMap.xml, 에 DataSource를 추가하고 Dao개발시에 각 DB별로 다른 DataSource를 쓰고 싶습니다.
샘플 소스 및 간단한 예제 부탁 드립니다.
1개는 트랜젝션을 관리해야 하고
나머지 DB는 select만 하면 되는 DB입니다.
그래서 context-datasource.xml, context-sqlMap.xml, 에 DataSource를 추가하고 Dao개발시에 각 DB별로 다른 DataSource를 쓰고 싶습니다.
샘플 소스 및 간단한 예제 부탁 드립니다.
A
안녕하세요. 표준프레임워크센터입니다.
우선 표준프레임워크는 업무 DAO가 EgovAbstractDAO를 extends 하도록 되어 있습니다.
이 EgovAbstractDAO는 2가지 역할을 제공합니다.
첫번째가 "sqlMapClient"를 Injection해 줍니다.
즉, 별도로 sqlMapClient(일반적으로 context-sqlMap.xml)를 injection할 필요가 없습니다.
(단점은 bean 이름이 sqlMapClient로 고정되어 있다는 것..)
두번째가 기존 방식의 경우 SqlMapClientDaoSupport가 제공하는
getSqlMapClientTemplate()를 통해 호출 하는 insert(), update(), queryForList(), queryForObject() 등을..
간단하게 insert(), update(), list(), selectByPk() 등으로 호출할 수 있도록 제공합니다.
그러나 여러 DB를 사용해야 하는 경우..
각 DB마다 DataSource 및 해당 DataSource를 지정하는 sqlMapClient가 있어야 합니다.
다시 말씀드리면..
DB 마다.. ① dataSource가 필요하고, ② sqlMapClient가 필요하고.
마지막으로 ③ 추가된 sqlMapClient를 injection하여 사용되는 EgovAbstractDAO가 필요합니다.
③의 경우는 간단하게 기존 EgovAbstractDAO를 상속해서.. 추가된 이름의 sqlMapClient를 injection하는 부분만 override하시면 됩니다.
예를 들면.. 다음과 같습니다.
① dataSource 정의 추가
------------------------------------------
<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:@IP:PORT:SID" />
<property name="username" value="user"/>
<property name="password" value="password"/>
</bean>
------------------------------------------
② sqlMapClient 추가
------------------------------------------
<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>
------------------------------------------
③ 새로운 EgovAbstractDAO 추가
------------------------------------------
public class OtherAbstractDAO extends EgovAbstractDAO {
/**
* DB별 sqlMapClient 지정
*/
@Resource(name = "otherSqlMapClient")
public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
super.setSuperSqlMapClient(sqlMapClient);
}
}
------------------------------------------
④ 업무별 EgovAbstractDAO 상속
- 기존 dataSource 접근 DAO : EgovAbstractDAO 상속
- 신규 dataSource 접근 DAO : OtherAbstractDAO 상속
즉, 두 개의 DB를 참조하는 경우는 ServiceImpl에서 각 DB를 참조하는 DAO를 호출합니다.
감사합니다.
우선 표준프레임워크는 업무 DAO가 EgovAbstractDAO를 extends 하도록 되어 있습니다.
이 EgovAbstractDAO는 2가지 역할을 제공합니다.
첫번째가 "sqlMapClient"를 Injection해 줍니다.
즉, 별도로 sqlMapClient(일반적으로 context-sqlMap.xml)를 injection할 필요가 없습니다.
(단점은 bean 이름이 sqlMapClient로 고정되어 있다는 것..)
두번째가 기존 방식의 경우 SqlMapClientDaoSupport가 제공하는
getSqlMapClientTemplate()를 통해 호출 하는 insert(), update(), queryForList(), queryForObject() 등을..
간단하게 insert(), update(), list(), selectByPk() 등으로 호출할 수 있도록 제공합니다.
그러나 여러 DB를 사용해야 하는 경우..
각 DB마다 DataSource 및 해당 DataSource를 지정하는 sqlMapClient가 있어야 합니다.
다시 말씀드리면..
DB 마다.. ① dataSource가 필요하고, ② sqlMapClient가 필요하고.
마지막으로 ③ 추가된 sqlMapClient를 injection하여 사용되는 EgovAbstractDAO가 필요합니다.
③의 경우는 간단하게 기존 EgovAbstractDAO를 상속해서.. 추가된 이름의 sqlMapClient를 injection하는 부분만 override하시면 됩니다.
예를 들면.. 다음과 같습니다.
① dataSource 정의 추가
------------------------------------------
<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:@IP:PORT:SID" />
<property name="username" value="user"/>
<property name="password" value="password"/>
</bean>
------------------------------------------
② sqlMapClient 추가
------------------------------------------
<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>
------------------------------------------
③ 새로운 EgovAbstractDAO 추가
------------------------------------------
public class OtherAbstractDAO extends EgovAbstractDAO {
/**
* DB별 sqlMapClient 지정
*/
@Resource(name = "otherSqlMapClient")
public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
super.setSuperSqlMapClient(sqlMapClient);
}
}
------------------------------------------
④ 업무별 EgovAbstractDAO 상속
- 기존 dataSource 접근 DAO : EgovAbstractDAO 상속
- 신규 dataSource 접근 DAO : OtherAbstractDAO 상속
즉, 두 개의 DB를 참조하는 경우는 ServiceImpl에서 각 DB를 참조하는 DAO를 호출합니다.
감사합니다.