由于项目开通了多个进件渠道,数据白天会存在多个数据库中,日终才会整合。
现在需要搞多个数据源去动态查询各个数据库的数据,本文配置了两个数据源,话不多说,接看代码。
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的加载数据源.