注:本文来源于  tianzhiwuqisspring+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 配置多数据源,切换数据源的更多相关文章

  1. Spring + Mybatis 项目实现动态切换数据源

    项目背景:项目开发中数据库使用了读写分离,所有查询语句走从库,除此之外走主库. 最简单的办法其实就是建两个包,把之前数据源那一套配置copy一份,指向另外的包,但是这样扩展很有限,所有采用下面的办法. ...

  2. Springboot+Mybatis AOP注解动态切换数据源

    在开发中因需求在项目中需要实现多数据源(虽然项目框架是SpringCloud,但是因其中只是单独的查询操作,觉得没必要开发一个项目,所以采用多数据源来进行实现) 1.在配置文件中创建多个数据连接配置 ...

  3. Spring boot配置多个Redis数据源操作实例

    原文:https://www.jianshu.com/p/c79b65b253fa Spring boot配置多个Redis数据源操作实例 在SpringBoot是项目中整合了两个Redis的操作实例 ...

  4. Spring+Mybatis配置

    Spring+Mybatis配置 之前做项目的时候用到了spring+mybatis框架,一直想抽空整理一下 Mybatis: mybatis是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架 ...

  5. maven spring mybatis配置注意点

    以下对使用maven配置spring+mybatis项目时,完成基本的配置需要添加的一些信息进行说明.仅对mybatis部分进行列举. maven添加mybatis支持 <!-- mybatis ...

  6. spring+mybatis 配置双数据源

    配置好后,发现网上已经做好的了, 不过,跟我的稍有不同, 我这里再拿出来现个丑: properties 文件自不必说,关键是这里的xml: <?xml version="1.0&quo ...

  7. spring+mybatis配置多个数据源

    http://www.cnblogs.com/lzrabbit/p/3750803.html

  8. spring boot配置MySQL8.0 Druid数据源

    创建spring boot项目,在pom中添加相应依赖 <!--web--> <dependency> <groupId>org.springframework.b ...

  9. 总结spring下配置dbcp,c3p0,proxool数据源链接池

    转载自 http://hiok.blog.sohu.com/66253191.html applicationContext-datasource-jdbc.xml <?xml version= ...

随机推荐

  1. 初探kafka streams

    1.启动zookeeper zkServer.cmd 2.启动kafka kafka-server-start.bat d:\soft\tool\Kafka\kafka_2.12-2.1.0\conf ...

  2. tomcat server.xml结构

    所有xml文件使用的文件头 <?xml version='1.0' encoding='utf-8'?> 2 <Server port="8005" shutdo ...

  3. Python——代码汇总

    1.三级菜单 2.Windows启动服务 3.常用的Python实现 4.字典的基本操作

  4. macbook 入门

    前面的话 第一次使用 Mac 之前,需要改变一些原有思维,不应该使用 Windows 的思维习惯去使用 Mac,Mac 会节省系统维护.清理杀毒.升级驱动等操作的时间,让我们可以专注做真正重要的事情, ...

  5. django rest framework serializers

    django rest framework serializers序列化   serializers是将复杂的数据结构变成json或者xml这个格式的 serializers有以下几个作用:- 将qu ...

  6. sips 命令(iMac 下系统自带)

    2. sips 2.1 -Z 指定最大宽高 //等比例缩放 scaleFill $ sips -Z 300 hgl.png $ for i in *.jpg;do sips -Z 300 " ...

  7. 树莓派3B+(一)

    第一步:安装raspbian系统 介绍:Raspbian是为树莓派设计,基于Debian的操作系统,由一个小团队开发.其不隶属于树莓派基金会,但被列为官方支持的操作系统. 下载地址:https://w ...

  8. vue关于为空使用默认值

    参考地址:https://segmentfault.com/q/1010000009898107/a-1020000009898747 实现效果如下:

  9. HDU - 3247 Resource Archiver (AC自动机,状压dp)

    \(\quad\)Great! Your new software is almost finished! The only thing left to do is archiving all you ...

  10. consul 剔除node_exporter的脚本

    #!/bin/bash clear echo "node_exporter注销工具" read -p "请输入要踢掉的节点IP,如果有多个IP,请使用英文格式 ',' 隔 ...