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

原文地址:https://www.cnblogs.com/yaowukonga/p/3553880.html