首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

一个WEB应用如何配置两个数据源,并根据不同查询使用不同数据源?(具体情况请见帖子内容)

2012-02-23 
一个WEB应用怎么配置两个数据源,并根据不同查询使用不同数据源?(具体情况请见帖子内容)各位大侠好!目前系

一个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中想用哪个就用哪个

热点排行