우리는 모든 DAO에서 Spring + iBatis를 사용하여 저장 프로 시저에서 데이터를 가져옵니다.Spring + iBatis를 사용하여 내 애플 리케이션에서 디자인 문제를 해결하는 방법
두 가지 주요 JNDI 연결이 있습니다. 하나는 datawarehouse
으로 가고 다른 하나는 livedb
으로갑니다.
최근에 많은 SP가 라이브 버스에서 데이터웨어 하우스로 이동되었으며 그 반대의 경우도 마찬가지입니다. 이제
, 각 DAO 직접 그냥 데이터웨어 하우스 또는 livedb 하나에 관련되지 않습니다
이 때문에 자바 측에서 문제를 만드는 것입니다. DAO A에는 데이터웨어 하우스와 관련된 메소드가 있고 다른 것들은 livedb와 관련이있을 수 있습니다. 이를 위해 우리는 sqlMapClientTemplate
을 변경해야합니다 (스프링은 DAO가 JNDI 연결과 일대일 매핑을하기 때문에). 그래서 우리는 이것을 다음과 같이 수행합니다 :
this.setSqlMapClientTemplate(getSqlTemplDW()); //get connection to DW
getSqlMapClientTemplate().queryForList("dw_sps.somemapping", parmMap);
this.setSqlMapClientTemplate(getSqlTempl()); //set connection to live db
당신이 볼 수있는 것처럼 ... 이것은 많은 장소에서 같은 코드를 많이 필요로합니다.
질문
은 두 개의 서로 다른 JNDI의 한 DAO의 이야기를하기 위해 설계 결함으로 간주인가? (I 고전 JDBC의 DAO 년이 아닌 설계 결함을 알고 있지만 그것을 봄 + iBatis를 가진 다른가요?) 당신이 거기까지 볼
getSqlTemplDW() 메소드는 다음과 같습니다 당신이 볼 수있는
public SqlMapClientTemplate getSqlTemplDW() {
SqlMapClient scl = (SqlMapClient) ApplicationInitializer.getApplicationContext().getBean("SqlMapClientDW");
DataSource dsc = (DataSource) ApplicationInitializer.getApplicationContext().getBean("DataSourceDW");
return new SqlMapClientTemplate(dsc, scl);
}
, 나는 javax.sql.DataSource를 사용하고있다. 그러나, 우리는이 수입을 사용하지 말라고 !! 그래서 지금 나는 붙어있다. 이 가져 오기를 사용할 수 없습니다 (DAO에서 연결 변경이 불가능 함). 그래서 저는 모든 DAO가 JNDI에 일대일 매핑 만하면된다는 제안을 받았습니다.
알고 싶습니다.이 문제를 해결하는 방법이 있습니까?
뼈대
스프링 피 ibatis.xml
<bean id="datasource1" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/RSRC/asdf/sdf/oltp"/>
</bean>
<bean id="datasource2" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/RSRC/asdf/efs/dw"/>
</bean>
<bean id="sqlMapClient1" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:sql-map-config-oracle.xml"/>
<property name="dataSource" ref="datasource1"/>
</bean>
<bean id="sqlMapClient2" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:sql-map-config-dw.xml"/>
<property name="dataSource" ref="datasource2"/>
</bean>
<!--dao bean-->
<bean id="examinationIfaceDAO" class="some.path.ExaminationIbatisDAO">
<property name="sqlMapClient" ref="sqlMapClient1"/>
<property name="dataSource" ref="datasource1"/>
</bean>
SQL 맵을 구성-oracle.xml
<sqlMapConfig>
<settings enhancementEnabled="true" useStatementNamespaces="true" />
<sqlMap resource="iBatis_file_with_sps_to_live_db.xml"/>
</sqlMapConfig>
SQL - -지도에서 config-dw.시험에 대한 XML
<sqlMapConfig>
<settings enhancementEnabled="true" useStatementNamespaces="true" />
<sqlMap resource="iBatis_file_with_sps_to_dw.xml" />
</sqlMapConfig>
인터페이스 어떤 행동에서 모든 전화
public interface ExaminationIfaceDAO {
public boolean goToDW(String userId);
public boolean goToLiveDB(String userId);
}
ExaminationIbatisDAO
public class ExaminationIbatisDAO implements EexaminationIfaceDAO {
public boolean goToDW(String userId) {
HashMap paramMap = new HashMap();
paramMap.put("userId", userId);
//following line will break as it does not know about this mapping file
getSqlMapClientTemplate().queryForObject("iBatis_file_with_sps_to_dw.isAuthorized", paramMap);
return true;
}
public boolean goToLiveDB(String userId) {
HashMap paramMap = new HashMap();
paramMap.put("userId", userId);
//following line will be ok as it knows about this mapping file
getSqlMapClientTemplate().queryForObject("iBatis_file_with_sps_to_live_db.isAuthorized", paramMap);
return true;
}
}
examDAO = (ExaminationIfaceDAO)ApplicationInitializer.getApplicationContext().getBean("eexaminationIfaceDAO");
boolean b = reexamDAO.goToDW("myuserid");
DAO는 하나의 데이터 액세스를 추상화해야한다고 확신합니다. 그러나, 지금이 순간에 내 솔루션이 될 수있는 여러 장소 에서이 같은 코드를 없애 버려. 각각의 DAO를 하나만 만들면됩니다. – Omnipresent
@Omnipresent 왜 두 DAO를 주입합니까 (동일 할 수도 있지만) 다르게 구성합니까? –
나는 당신이 무슨 뜻인지 이해하지 못했거나 그것을 어떻게하는지 잘 모릅니다. 2 개의 DAO를 주입하는 예가 있습니까? – Omnipresent