日期:2014-05-17  浏览次数:20747 次

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