我們在所有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