Мы используем Spring + iBatis во всех наших DAO для получения данных из хранимых процедур.
Существует два основных соединения JNDI.один идет на datawarehouse
, а другой - на livedb
.
В последнее время многие СП были перенесены из liveb в хранилище данных и наоборот.
Это создает проблемы на стороне java, потому что:
Теперь каждый DAO НЕ ПРОСТО напрямую связан с хранилищем данных или liveb.В DAO A могут существовать методы, относящиеся к хранилищу данных, а другие могут относиться к livingb.Чтобы сделать это, мы должны изменить sqlMapClientTemplate
(потому что пружина заставляет дао иметь однозначное сопоставление с соединением 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 даосах, но отличается ли он от 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).Поэтому я получаю предложения, что у каждого дао должно быть только одно-одно сопоставление с JNDI.
Я хочу знать ... Есть ли способ обойти это вообще?
Скелет
spring-for-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-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");