一个WEB应用怎么配置两个数据源,并根据不同查询使用不同数据源?(具体情况请见帖子内容)
各位大侠好!
目前系统情况:
我们的系统是SSH架构的,工程是用websphere发布的,数据源也是在websphere上配置的,就是JNDI数据源吧。
需求:
现在我想再配置一个数据源,也就是有两个数据源,在使用系统功能点击某几个报表时,可以用新的数据源进行查询数据,而其他报表还是用旧的数据源,并且也不会影响到其他功能的插入更新数据库。
进展情况:我了解到的方法首先是在websphere上配置新数据源,具体怎么配这个不操心,有人配。其次是更改项目中的WEB.XML文件,再加一个配置,如下:
Java code
<resource-ref>
<description>Oracle Datasource</description>
<res-ref-name>jdbc/旧数据源名</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<description>Oracle Datasource</description>
<res-ref-name>jdbc/新数据源名</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
然后是就是要改报表查询的代码,这个我就不知道怎么做了,所有报表的查询方法都是写在一个DAO里,不知道怎么根据不同的方法去连接不同的数据源,举个例子:
Java code
public List<Object> getXXXReport(DTOReports rc) {
StringBuffer sqlString = new StringBuffer();
/**
SQL拼装语句,忽略
**/
//查询
List<Object> result = (List<Object>) this.getJpaTemplate().execute(
new JpaCallback() {
public Object doInJpa(EntityManager entitymanager)
throws PersistenceException {
Query query = entitymanager.createNativeQuery(sqlString
.toString());
List<Object> list = query.getResultList();
return list;
}
});
return result;
}
这是其中一个报表的查询方法,不知道应该怎么改,或者不改查询方法,有没有其他的根据查询方法判断使用数据源的办法。
另外除了以上几步,需要实现我的需求还需要做哪些工作,先谢过各位大侠!
------解决方案--------------------
将一个DAO分为两个DAO,代码一样的
sessionFactory注入的时候数据源不一样
然后service层注入不同的DAO
------解决方案--------------------
如果表结构一样的话,可以用一个DAO就可以了,表结构不一样的话,最好要用二个DAO
配置SPRING的DAO注入
<bean id="dao_a" class="com.xxx.DAO1Impl">
<property name="dataSource" ref="dataSource_A"></property>
</bean>
<bean id="dao_a" class="com.xxx.DAO2Impl">
<property name="dataSource" ref="dataSource_B"></property>
</bean>
------解决方案--------------------
数据源等一层层都是IOC容器自动注入的,所以不能通过代码来决定使用哪个数据源,所以之有通过service层引用不同的DAO,然后不同的DAO引用不同的sessionFactory,不同的sessionFactory引用不同的数据源
------解决方案--------------------其实只需要写一个动态设置connect的工具就可以了,根据前台传过来的判断新旧的区别,分别去获取不同的connect连接设置到DAO对象就可以了没必要分成2个DAO增加代码量
------解决方案--------------------我们也是分了两个数据源,用两个DAO引用不同的数据源,使用时区别对待就可以的
------解决方案--------------------或者dao实现俩数据源的接口,修改量会小些
------解决方案--------------------两个数据源对象同时注入到DAO中不行吗,在DAO中想用哪个就用哪个