双数据源

<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <!-- 基本信息 -->  
       <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);//切换回主数据源 

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值