SpringMVC动态配置双数据源

由于项目开通了多个进件渠道,数据白天会存在多个数据库中,日终才会整合。

现在需要搞多个数据源去动态查询各个数据库的数据,本文配置了两个数据源,话不多说,接看代码。

applicationContext.xml


<!--     可以读取多个位置的配置文件--> 
    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <!-- <list> -->
                <value>classpath:jdbc.properties</value>
            <!-- </list> -->
        </property>
    </bean>

  <context:component-scan base-package="com.jp.*" />


    <!-- 定义数据源第一个数据源       ,使用C3P0数据源实现 -->
    <!-- 设置连接数据库的驱动、URL、用户名、密码 连接池最大连接数、最小连接数、初始连接数等参数 -->
    <bean id="dataSourceOne" destroy-method="close"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass">
            <value>${jdbc.driver}</value>
        </property>
        <property name="jdbcUrl">
            <value>${jdbc.url}</value>
        </property>
        <property name="user">
            <value>${jdbc.username}</value>
        </property>
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
        <property name="maxPoolSize">
            <value>${maxPoolSize}</value>
        </property>
        <property name="minPoolSize">
            <value>${minPoolSize}</value>
        </property>
        <property name="initialPoolSize">
            <value>${initialPoolSize}</value>
        </property>
        <property name="maxIdleTime">
            <value>${maxIdleTime}</value>
        </property>
        <property name="idleConnectionTestPeriod">
            <value>${idleConnectionTestPeriod}</value>
        </property>
        <property name="acquireRetryAttempts">
            <value>${acquireRetryAttempts}</value>
        </property>
        <property name="breakAfterAcquireFailure">
            <value>${breakAfterAcquireFailure}</value>
        </property>
        <property name="testConnectionOnCheckout">
            <value>${testConnectionOnCheckout}</value>
        </property>

    </bean>
    <!-- 定义数据源第二个数据源       ,使用C3P0数据源实现 -->
    <!-- 设置连接数据库的驱动、URL、用户名、密码 连接池最大连接数、最小连接数、初始连接数等参数 -->

    <bean id="dataSourceTwo" destroy-method="close"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass">
            <value>${jdbc2.driver}</value>
        </property>
        <property name="jdbcUrl">
            <value>${jdbc2.url}</value>
        </property>
        <property name="user">
            <value>${jdbc2.username}</value>
        </property>
        <property name="password">
            <value>${jdbc2.password}</value>
        </property>
        <property name="maxPoolSize">
            <value>${maxPoolSize}</value>
        </property>
        <property name="minPoolSize">
            <value>${minPoolSize}</value>
        </property>
        <property name="initialPoolSize">
            <value>${initialPoolSize}</value>
        </property>
        <property name="maxIdleTime">
            <value>${maxIdleTime}</value>
        </property>
        <property name="idleConnectionTestPeriod">
            <value>${idleConnectionTestPeriod}</value>
        </property>
        <property name="acquireRetryAttempts">
            <value>${acquireRetryAttempts}</value>
        </property>
        <property name="breakAfterAcquireFailure">
            <value>${breakAfterAcquireFailure}</value>
        </property>
        <property name="testConnectionOnCheckout">
            <value>${testConnectionOnCheckout}</value>
        </property>

    </bean> 

    <!-- 动态数据源 加载转换         默认 MYSQL-->
       <bean id="dynamicDataSource" class="com.jp.controller.switchDatesource.DataSources">  
        <property name="targetDataSources">  
            <map key-type="java.lang.String">  
                <entry value-ref="dataSourceOne" key="MYSQL"></entry>  
                <entry value-ref="dataSourceTwo" key="ORACLE"></entry>  
            </map>  
        </property>  
        <property name="defaultTargetDataSource" ref="dataSourceOne">  
        </property>  
    </bean> 

<!-- 配置 jdbcTemplate-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dynamicDataSource"></property>
    </bean>

    <!-- JNDI方式配置数据源 -->
    <!-- 
        <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="${jndiName}"></property> </bean>
     -->

com/jp/controller/switchDatesource/DataSourceInstances.java

public class DataSourceInstances {
     public static final String MYSQL="MYSQL";  
     public static final String ORACLE="ORACLE";  
}

com/jp/controller/switchDatesource/DataSources.java

package com.jp.controller.switchDatesource;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
//AbstractRoutingDataSource说是springmvc为多数据源编写的工具类
public class DataSources extends AbstractRoutingDataSource{  
    Object DATESOURCE = null;

    @Override
    protected Object determineCurrentLookupKey() {
        DATESOURCE = DataSourceSwitch.getDataSourceType();
        if (DATESOURCE == null) {
            DATESOURCE = "MYSQL";
        }
        return DATESOURCE;

    }
} 

com/jp/controller/switchDatesource/DataSourceSwitch.java

package com.jp.controller.switchDatesource;

public class DataSourceSwitch {
     private static final ThreadLocal contextHolder=new ThreadLocal();  

        public static void setDataSourceType(String dataSourceType){  
            contextHolder.set(dataSourceType);  
        }  

        public static String getDataSourceType(){  
            return (String) contextHolder.get();  
        }  

        public static void clearDataSourceType(){  
            contextHolder.remove();  
        }  
}

com/jp/controller/TestAction.java

package com.jp.controller;

import *;

@Controller
@RequestMapping("/index")
public class TestAction {

    @Autowired
    private UserServlce userservlce;
    UserQuery uq =new UserQuery ();
    @RequestMapping("/ORACLE.do")
    String ORACLE() {

        DataSourceSwitch.setDataSourceType(DataSourceInstances.ORACLE);//通过DataSourceSwitch配置指定数据源
        UserQuery userlist = userservlce.findAll( uq);

        for (User m : userlist.getUserList()) {
            System.out.println(m.getLoginName());
        }
        return "userlist";
    }


@RequestMapping("/MYSQL.do")
String MYSQL() {
    //通过DataSourceSwitch配置指定数据源                
                DataSourceSwitch.setDataSourceType(DataSourceInstances.MYSQL);
        UserQuery userlist = userservlce.findAll( uq);

        for (User m : userlist.getUserList()) {
            System.out.println(m.getLoginName());
        }
        return "userlist";
    }

}

xml,对数据库进行配置,对关紧的就是

<!-- 动态数据源 加载转换 默认 MYSQL-->
<bean id="dynamicDataSource" class="com.jp.controller.switchDatesource.DataSources">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry value-ref="dataSourceOne" key="MYSQL"></entry>
<entry value-ref="dataSourceTwo" key="ORACLE"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSourceOne">
</property>
</bean>

总结 :
这里面指定了动态数据源转换的java类,
然后action访问的时候会 通过DataSourceSwitch.setDataSourceType()配置指定数据,
通过DataSources (extends AbstractRoutingDataSource)切换xml的加载数据源.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值