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
【签名→→→】【****知其然知其所以然****】
工具只能帮助我们解决我们认识到的问题,解决不了我们都没理解的问题。
不能再把一切扔给框架、容器、工具!
首先理解你的业务逻辑,理解你要实现的功能,
然后搞清楚框架、容器、工具会帮助我们做什么。
只有理解了自己的业务逻辑,理解了自己的代码,理解了自己要用到的第三方代码,
才能真正完美地实现我们需要的功能!