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

  • 相关阅读:
    在最近在研究榴莲品种的人工智能识别
    iOS开发:多线程技术概述
    Objective-C开发编码规范
    为什么OC语言很难
    内存堆栈的区别
    HR筒子说:程序猿面试那点事
    Objective-C语言的一些基础特性
    学习swift语言的快速入门教程推荐
    性能测试告诉你 mysql 数据库存储引擎该如何选?
    【柠檬班】需要先登录的接口如何做性能测试?
  • 原文地址:https://www.cnblogs.com/yaowukonga/p/3553880.html
Copyright © 2011-2022 走看看