spring+myBatis 配置多数据源,切换数据源

原创 2016年06月01日 10:44:38

一个项目里一般情况下只会使用到一个数据库,但有的需求是要显示其他数据库的内容,像这样,我认为有两种做法

1、在使用另一个数据库的项目里写一些restful接口,满足移动端PC端的同时也满足其他应用调用数据的需求;

2、就是在项目里配置多数据源;

我现在就是要使用另一个数据库的数据,想到了以上两种方法,为了更加熟悉spring,我打算使用第二种方案;

我在百度上查了好多关于spring配置多数据源的blog,最后综合一些,总结一下,用最简洁,最直观的方法来实现这个功能


首先,单数据源配置流程如下


一个数据库对应一个dataSource,然后对应sqlSession,然后再在Dao层实现,配置如下

            <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
            destroy-method="close">  
            <property name="driverClassName" value="${datasource.driver}" />  
            <property name="url" value="${datasource.url}" />  
            <property name="username" value="${datasource.username}" />  
            <property name="password" value="${datasource.password}" />  
            <property name="initialSize" value="${datasource.initialSize}"></property>  
            <property name="maxActive" value="${datasource.maxActive}"></property>  
            <property name="maxIdle" value="${datasource.maxIdle}"></property>  
            <property name="minIdle" value="${datasource.minIdle}"></property>  
            <property name="maxWait" value="${datasource.maxWait}"></property>  
        </bean>  
      
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
            <property name="dataSource" ref="dataSource" />  
            <property name="mapperLocations" value="classpath:com/iquant/simulated/mapping/*.xml"></property>  
        </bean>  
      
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
            <property name="basePackage" value="com.iquant.simulated.dao" />  
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>  
        </bean> 
      
        <bean id="transactionManager"  
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
            <property name="dataSource" ref="dataSource" />  
        </bean>  

但数据源就是这样的配置,数据库连接和一些属性的配置--->sqlSession配置--->映射文件哦欸之--->事物管理

如果是多数据源,有下面两种方案

A和B,先看看B,分别为两个数据源配置两个sqlSession,然后再Dao层实现,虽然功能实现了,但是到后期如果在增加多个数据源的话,修改复杂,维护起来也相当的麻烦,也不符合开闭原则;

A同样配置了两个dataSource,然后实现一个DynamicDataSource类,使用一个sqlSession,这样维护起来也非常的容易,我是用的就是A,配置起来相当简单!

毋庸置疑,两个dataSouce

        <bean id="dataSourceSig" class="org.apache.commons.dbcp.BasicDataSource"  
            destroy-method="close">  
            <property name="driverClassName" value="${datasource.driver}" />  
            <property name="url" value="${datasource.sig.url}" />  
            <property name="username" value="${datasource.username}" />  
            <property name="password" value="${datasource.password}" />  
            <property name="initialSize" value="${datasource.initialSize}"></property>  
            <property name="maxActive" value="${datasource.maxActive}"></property>  
            <property name="maxIdle" value="${datasource.maxIdle}"></property>  
            <property name="minIdle" value="${datasource.minIdle}"></property>  
            <property name="maxWait" value="${datasource.maxWait}"></property>  
        </bean> 
        
        <bean id="dataSourceSim" class="org.apache.commons.dbcp.BasicDataSource"  
            destroy-method="close">  
            <property name="driverClassName" value="${datasource.driver}" />  
            <property name="url" value="${datasource.sim.url}" />  
            <property name="username" value="${datasource.username}" />  
            <property name="password" value="${datasource.password}" />  
            <property name="initialSize" value="${datasource.initialSize}"></property>  
            <property name="maxActive" value="${datasource.maxActive}"></property>  
            <property name="maxIdle" value="${datasource.maxIdle}"></property>  
            <property name="minIdle" value="${datasource.minIdle}"></property>  
            <property name="maxWait" value="${datasource.maxWait}"></property>  
        </bean> 
      
然后配置自己实现的com.iquant.signal.configer.DynamicDataSource类,需指定默认的数据源,如使用其他再进行切换
      	        <bean id="dataSource" class="com.iquant.signal.configer.DynamicDataSource">    
		    <property name="targetDataSources">    
		        <map key-type="java.lang.String">    
		            <entry value-ref="dataSourceSig" key="dataSourceSig"></entry>    
		            <entry value-ref="dataSourceSim" key="dataSourceSim"></entry>    
		        </map>    
		    </property>  
		    <!-- 默认使用dataSourceSig的数据源 -->  
		    <property name="defaultTargetDataSource" ref="dataSourceSig"></property>       
		</bean>
sqlSession和事物和之前一样,不用改动,实现DynamicDataSource类

public class DynamicDataSource extends AbstractRoutingDataSource {
	@Override
	protected Object determineCurrentLookupKey() {
		return DataSourceContextHolder.getDBType();
	}
}
继承AbstractRoutingDataSource 重写determineCurrentLookupKey方法

实现DataSourceContextHolder类

public class DataSourceContextHolder {
	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();    
	
	public static void setDBType(String dbType) {    
		contextHolder.set(dbType);    
	}    

	public static String getDBType() {    
		return ((String) contextHolder.get());    
	}    

	public static void clearDBType() {    
		contextHolder.remove();    
	}    
}
到此,多数据源就配置完成,如果想切换数据源,在代码操作对应数据库之前,加上此句代码

//注意这里在调用service前切换到dataSourceSim的数据源  
DataSourceContextHolder.setDBType("dataSouceSim");   

这样就完成了多数据源的配置和切换功能,以后还有数据库添加,在配置一个dataSouce3.4.5.6.等等,就行了


参考BLOG

http://blog.csdn.net/wangpeng047/article/details/8866239

http://x125858805.iteye.com/blog/2061713

版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring+SpringMVC+Mybatis 多数据源整合

此篇文章是基于Spring3.0和mybatis3.2的 总体大概流程: 1. 拷贝所需jar 2.写一个数据库切换的工具类:DataSourceContextHolder,用来切换数据库 3.写一...

spring+mybatis配置多数据源总结,重点是动态加载数据源,支持动态切换

最近在做一款游戏的GM管理平台,需要连接游戏的数据库去查询数据;由于游戏的每个服的数据是独立的,所以就有了连接多个数据库的问题;经过一番查找,好在mybatis的学习资源还少,很快找到了配置多数据源的...

【Java】一次SpringMVC+ Mybatis 配置多数据源经历

【Java】一次SpringMVC+ Mybatis 配置多数据源经历 现在在维护的是学校的一款信息服务APP的后台,最近要开发一些新功能,其中一个就是加入学校电影院...

Spring Boot + Mybatis多数据源和动态数据源配置

网上的文章基本上都是只有多数据源或只有动态数据源,而最近的项目需要同时使用两种方式,记录一下配置方法供大家参考。 应用场景 项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台...

spring+mybatis多数据源(数据库主从)实例

applicationContext.xml [html] view plain copy xml version="1.0" encoding="...

Java之——SpringMVC+MyBitis+多数据源切换

spring mvc+mybatis+多数据源切换 选取oracle,mysql作为例子切换数据源。oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换。 web....

spring+springmvc+mybatis链接多数据源

1、创建枚举表示不同的数据源 /** * 数据源的类别:ONE/TWO */ public enum DataSources { ONE,TWO } 2、通过 TheadLocal 来保存...

mybatis自动切换多个数据源

假设现在有两个数据库myone和mytwo,读者可以理解为一个写库,一个读库,数据库中都各自有一个表,表的格式都一样,如下: -----------------------------------...
  • yizhenn
  • yizhenn
  • 2016年08月11日 14:17
  • 2363

mybatis连接多个数据源成功案例

1.db.properties配置文件设置 driver:com.mysql.jdbc.Driver f_url:jdbc:mysql://**:3306/**?useUnicode=tr...

MyBatis多数据源配置(读写分离)

MyBatis多数据源配置(读写分离)首先说明,本文的配置使用的最直接的方式,实际用起来可能会很麻烦。实际应用中可能存在多种结合的情况,你可以理解本文的含义,不要死板的使用。多数据源的可能情况1.主从...
  • isea533
  • isea533
  • 2015年07月09日 13:45
  • 52190
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring+myBatis 配置多数据源,切换数据源
举报原因:
原因补充:

(最多只允许输入30个字)