SpringMVC动态配置双数据源

来源:互联网 发布:手机角度水平仪软件 编辑:程序博客网 时间:2024/06/05 04:53
由于项目开通了多个进件渠道,数据白天会存在多个数据库中,日终才会整合。现在需要搞多个数据源去动态查询各个数据库的数据,本文配置了两个数据源,话不多说,接看代码。

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的加载数据源.

0 0
原创粉丝点击