zoukankan      html  css  js  c++  java
  • Spring多数据源的动态切换

    Spring多数据源的动态切换  

    目前很多项目中只能配置单个数据源,那么如果有多个数据源肿么办?Spring提供了一个抽象类AbstractRoutingDataSource,为我们很方便的解决了这个问题。
    1.写一个DynamicDataSource类继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法

    public class DynamicDataSource extends AbstractRoutingDataSource{
     private final static Logger  logger  = LoggerFactory.getLogger("DynamicDataSource");   
     
        @Override  
        protected Object determineCurrentLookupKey() {   
            return DbContextHolder.getDbType();   
        }   
    }

    2.写一个线程安全的ThreadLocal

    public class DbContextHolder {
     private static final ThreadLocal contextHolder = new ThreadLocal();   
       
        public static void setDbType(String dbType) {   
            contextHolder.set(dbType);   
        }   
      
        public static String getDbType() {   
            return (String) contextHolder.get();   
        }   
      
        public static void clearDbType() {   
            contextHolder.remove();   
        }   
    }

    3.dataSource的配置

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3 xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
     4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
     5 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
     6 default-autowire="byName">
     7 
     8 <bean id="aTestDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     9 <property name="driverClassName" value="${a.jdbc.driverClassName}" />
    10 <property name="url" value="${a.jdbc.url}" />
    11 <property name="username" value="${a.jdbc.username}" />
    12 <property name="password" value="${a.jdbc.password}" />
    13 </bean>
    14 
    15 <bean id="bTestDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    16 <property name="driverClassName" value="${b.jdbc.driverClassName}" />
    17 <property name="url" value="${gott.jdbc.url}" />
    18 <property name="username" value="${b.jdbc.username}" />
    19 <property name="password" value="${b.jdbc.password}" />
    20 </bean>
    21 
    22 <bean id="dataSource" class="***.DynamicDataSource">
    23 <property name="targetDataSources">
    24 <map key-type="java.lang.String">
    25 <entry key="aTestDataSource" value-ref="aTestDataSource" />
    26 <entry key="bTestDataSource" value-ref="bTestDataSource" />
    27 </map>
    28 </property>
    29 <property name="aTestDataSource" ref="aTestDataSource" />
    30 </bean>
    31 </beans>

    4.当需要切换数据源时,只要调用一行代码就可以了

    DbContextHolder.setDbType("aTestDataSource");

    当然有兴趣的朋友也可以用aop去自动切换数据源

    转自:http://blog.163.com/wang_hj138@126/blog/static/140800106201263151242338/

     参考:SSH配置多个数据源---http://zhoujingxian.iteye.com/blog/883642

    Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

    http://www.cnblogs.com/hoojo/p/Spring_Hibernate_MyBatis_MultipleDataSource_switchDataSource.html

  • 相关阅读:
    linux运维、架构之路-MySQL备份与恢复(四)
    linux运维、架构之路-MHA高可用方案
    Tensorflow环境安装
    Sublime Text3 旧版本下载以及破解激活方式
    《SDN期末作业——实现负载均衡》
    SDN第六次上机作业
    自定义Toast的出现样式
    SDN第五次上机作业
    SDN第4次上机作业
    Context与ApplicationContext的区别
  • 原文地址:https://www.cnblogs.com/yaowukonga/p/3553880.html
Copyright © 2011-2022 走看看