spring+myBatis 配置多数据源,切换数据源
注:本文来源于 tianzhiwuqis 《spring+myBatis 配置多数据源,切换数据源》
一个项目里一般情况下只会使用到一个数据库,但有的需求是要显示其他数据库的内容,像这样,我认为有两种做法
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的数据源
// 经过测试可以写到serice层
DataSourceContextHolder.setDBType("dataSouceSim");
// 若要切换其他数据源,可能要想进行cleanDBType操作
DataSourceContextHolder.cleanDBType();
// 然后再对其他数据源进行setDBType
这样就完成了多数据源的配置和切换功能,以后还有数据库添加,在配置一个dataSouce3.4.5.6.等等,就行了
参考BLOG
http://blog.csdn.net/wangpeng047/article/details/8866239
http://x125858805.iteye.com/blog/2061713
spring+myBatis 配置多数据源,切换数据源的更多相关文章
- Spring + Mybatis 项目实现动态切换数据源
项目背景:项目开发中数据库使用了读写分离,所有查询语句走从库,除此之外走主库. 最简单的办法其实就是建两个包,把之前数据源那一套配置copy一份,指向另外的包,但是这样扩展很有限,所有采用下面的办法. ...
- Springboot+Mybatis AOP注解动态切换数据源
在开发中因需求在项目中需要实现多数据源(虽然项目框架是SpringCloud,但是因其中只是单独的查询操作,觉得没必要开发一个项目,所以采用多数据源来进行实现) 1.在配置文件中创建多个数据连接配置 ...
- Spring boot配置多个Redis数据源操作实例
原文:https://www.jianshu.com/p/c79b65b253fa Spring boot配置多个Redis数据源操作实例 在SpringBoot是项目中整合了两个Redis的操作实例 ...
- Spring+Mybatis配置
Spring+Mybatis配置 之前做项目的时候用到了spring+mybatis框架,一直想抽空整理一下 Mybatis: mybatis是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架 ...
- maven spring mybatis配置注意点
以下对使用maven配置spring+mybatis项目时,完成基本的配置需要添加的一些信息进行说明.仅对mybatis部分进行列举. maven添加mybatis支持 <!-- mybatis ...
- spring+mybatis 配置双数据源
配置好后,发现网上已经做好的了, 不过,跟我的稍有不同, 我这里再拿出来现个丑: properties 文件自不必说,关键是这里的xml: <?xml version="1.0&quo ...
- spring+mybatis配置多个数据源
http://www.cnblogs.com/lzrabbit/p/3750803.html
- spring boot配置MySQL8.0 Druid数据源
创建spring boot项目,在pom中添加相应依赖 <!--web--> <dependency> <groupId>org.springframework.b ...
- 总结spring下配置dbcp,c3p0,proxool数据源链接池
转载自 http://hiok.blog.sohu.com/66253191.html applicationContext-datasource-jdbc.xml <?xml version= ...
随机推荐
- 初探kafka streams
1.启动zookeeper zkServer.cmd 2.启动kafka kafka-server-start.bat d:\soft\tool\Kafka\kafka_2.12-2.1.0\conf ...
- tomcat server.xml结构
所有xml文件使用的文件头 <?xml version='1.0' encoding='utf-8'?> 2 <Server port="8005" shutdo ...
- Python——代码汇总
1.三级菜单 2.Windows启动服务 3.常用的Python实现 4.字典的基本操作
- macbook 入门
前面的话 第一次使用 Mac 之前,需要改变一些原有思维,不应该使用 Windows 的思维习惯去使用 Mac,Mac 会节省系统维护.清理杀毒.升级驱动等操作的时间,让我们可以专注做真正重要的事情, ...
- django rest framework serializers
django rest framework serializers序列化 serializers是将复杂的数据结构变成json或者xml这个格式的 serializers有以下几个作用:- 将qu ...
- sips 命令(iMac 下系统自带)
2. sips 2.1 -Z 指定最大宽高 //等比例缩放 scaleFill $ sips -Z 300 hgl.png $ for i in *.jpg;do sips -Z 300 " ...
- 树莓派3B+(一)
第一步:安装raspbian系统 介绍:Raspbian是为树莓派设计,基于Debian的操作系统,由一个小团队开发.其不隶属于树莓派基金会,但被列为官方支持的操作系统. 下载地址:https://w ...
- vue关于为空使用默认值
参考地址:https://segmentfault.com/q/1010000009898107/a-1020000009898747 实现效果如下:
- HDU - 3247 Resource Archiver (AC自动机,状压dp)
\(\quad\)Great! Your new software is almost finished! The only thing left to do is archiving all you ...
- consul 剔除node_exporter的脚本
#!/bin/bash clear echo "node_exporter注销工具" read -p "请输入要踢掉的节点IP,如果有多个IP,请使用英文格式 ',' 隔 ...