<!-- 基本信息 -->
<property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
<!-- 其他配置 -->
<!--maxActive: 最大连接数量-->
<property name="maxActive" value="15"/>
<!--minIdle: 最小空闲连接-->
<property name="minIdle" value="5"/>
<!--maxIdle: 最大空闲连接-->
<property name="maxIdle" value="10"/>
<!--initialSize: 初始化连接-->
<property name="initialSize" value="5"/>
<!-- 连接被泄露时是否打印 -->
<property name="logAbandoned" value="true"/>
<!--removeAbandoned: 是否自动回收超时连接-->
<property name="removeAbandoned" value="true"/>
<!--removeAbandonedTimeout: 超时时间(以秒数为单位)-->
<property name="removeAbandonedTimeout" value="10"/>
<!--maxWait: 超时等待时间以毫秒为单位 1000等于60秒-->
<property name="maxWait" value="10000"/>
<!-- 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. -->
<property name="timeBetweenEvictionRunsMillis" value="18000"/>
<!-- 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->
<property name="numTestsPerEvictionRun" value="5"/>
<!-- 1000 * 60 * 30 连接在池中保持空闲而不被空闲连接回收器线程-->
<property name="minEvictableIdleTimeMillis" value="18000"/>
<!-- Mysql八小时的问题-->
<property name="testOnBorrow" value="true"/>
<property name="validationQuery" value="select 1"/>
</bean>
<bean id="oracleDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- 基本信息 -->
<property name="driverClassName"><value>${jdbc.oracleDriver}</value></property>
<property name="url"><value>${jdbc.oracleUrl}</value></property>
<property name="username"><value>${jdbc.oracleUN}</value></property>
<property name="password"><value>${jdbc.oraclePwd}</value></property>
<!-- 其他配置 -->
<!--maxActive: 最大连接数量-->
<property name="maxActive" value="15"/>
<!--minIdle: 最小空闲连接-->
<property name="minIdle" value="5"/>
<!--maxIdle: 最大空闲连接-->
<property name="maxIdle" value="10"/>
<!--initialSize: 初始化连接-->
<property name="initialSize" value="5"/>
<!-- 连接被泄露时是否打印 -->
<property name="logAbandoned" value="true"/>
<!--removeAbandoned: 是否自动回收超时连接-->
<property name="removeAbandoned" value="true"/>
<!--removeAbandonedTimeout: 超时时间(以秒数为单位)-->
<property name="removeAbandonedTimeout" value="10"/>
<!--maxWait: 超时等待时间以毫秒为单位 1000等于60秒-->
<property name="maxWait" value="10000"/>
<!-- 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. -->
<property name="timeBetweenEvictionRunsMillis" value="18000"/>
<!-- 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->
<property name="numTestsPerEvictionRun" value="5"/>
<!-- 1000 * 60 * 30 连接在池中保持空闲而不被空闲连接回收器线程-->
<property name="minEvictableIdleTimeMillis" value="18000"/>
<!-- Mysql八小时的问题-->
<property name="testOnBorrow" value="true"/>
<property name="validationQuery" value="select sysdate from dual"/>
</bean>
<bean id="dataSource" class="com.yuhui.util.DynamicDataSource">
<property name="defaultTargetDataSource" ref="mysqlDataSource"/>
<property name="targetDataSources">
<map>
<entry key="mysqlDataSource" value-ref="mysqlDataSource"/>
<entry key="oracleDataSource" value-ref="oracleDataSource"/>
</map>
</property>
</bean>
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource{
public static final String mysqlDataSource= "mysqlDataSource";
public static final String oracleDataSource = "oracleDataSource";
//本地线程,获取当前正在执行的currentThread
public static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setCustomerType(String customerType) {
contextHolder.set(customerType);
}
public static String getCustomerType() {
return contextHolder.get();
}
public static void clearCustomerType() {
contextHolder.remove();
}
@Override
protected Object determineCurrentLookupKey() {
return getCustomerType();
}
}
try {
DynamicDataSource.clearCustomerType();//重点: 实际操作证明,切换的时候最好清空一下
DynamicDataSource.setCustomerType(DynamicDataSource.oracleDataSource);//切换数据源,设置后 就OK了。可以随时切换过来(在controller层切换)
} catch (Exception e) {
e.printStackTrace();
}finally {
DynamicDataSource.clearCustomerType();
DynamicDataSource.setCustomerType(DynamicDataSource.mysqlDataSource);//切换回主数据源
}