我们在所有DAO中使用Spring + iBatis从存储过程中获取数据。如何使用Spring + iBatis解决我应用程序中的设计问题
有两个主要的JNDI连接。一个去datawarehouse
,另一个去livedb
。
最近很多SP已经从livedb移动到数据仓库,反之亦然。
这是在Java端创建的问题,因为:
现在,每个DAO并不直接涉及JUST要么数据仓库或livedb。 DAO A中可能存在与数据仓库相关的方法,而其他方法可能与livedb相关。为了做到这一点,我们必须更改sqlMapClientTemplate
(因为spring使得dao与JNDI连接有一对一映射)。所以我们这样做:
this.setSqlMapClientTemplate(getSqlTemplDW()); //get connection to DW
getSqlMapClientTemplate().queryForList("dw_sps.somemapping", parmMap);
this.setSqlMapClientTemplate(getSqlTempl()); //set connection to live db
正如你所看到的......这迫使我们在一堆地方有很多相同的代码。
问题
是它被认为是设计缺陷有一个DAO聊到两个不同的JNDI的? (我知道它不是在传统的JDBC DAOS一个设计缺陷,但它与Spring + 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-MAP-CONFIG-oracle.xml
<sqlMapConfig>
<settings enhancementEnabled="true" useStatementNamespaces="true" />
<sqlMap resource="iBatis_file_with_sps_to_live_db.xml"/>
</sqlMapConfig>
SQL-MAP-配置-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只有一个jndi现在是我们的巨大努力 – Omnipresent 2010-06-23 15:55:46
@Omnipresent为什么不注入两个DAO(可能是相同的),但配置不同? – 2010-06-23 16:00:44
我不确定我是否理解你的意思,或者我不知道如何去做。有一个例子,我可以看到注入两个DAO的? – Omnipresent 2010-06-23 16:05:53