注:本文来源于  tianzhiwuqisspring+myBatis 配置多数据源,切换数据源

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

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

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

我现在就是要使用另一个数据库的数据,想到了以上两种方法,为了更加熟悉spring,我打算使用第二种方案;我在百度上查了好多关于spring配置多数据源的blog,最后综合一些,总结一下,用最简洁,最直观的方法来实现这个功能.

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

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

  1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  2. destroy-method="close">
  3. <property name="driverClassName" value="${datasource.driver}" />
  4. <property name="url" value="${datasource.url}" />
  5. <property name="username" value="${datasource.username}" />
  6. <property name="password" value="${datasource.password}" />
  7. <property name="initialSize" value="${datasource.initialSize}"></property>
  8. <property name="maxActive" value="${datasource.maxActive}"></property>
  9. <property name="maxIdle" value="${datasource.maxIdle}"></property>
  10. <property name="minIdle" value="${datasource.minIdle}"></property>
  11. <property name="maxWait" value="${datasource.maxWait}"></property>
  12. </bean>
  13.  
  14. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  15. <property name="dataSource" ref="dataSource" />
  16. <property name="mapperLocations" value="classpath:com/iquant/simulated/mapping/*.xml"></property>
  17. </bean>
  18.  
  19. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  20. <property name="basePackage" value="com.iquant.simulated.dao" />
  21. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
  22. </bean>
  23.  
  24. <bean id="transactionManager"
  25. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  26. <property name="dataSource" ref="dataSource" />
  27. </bean>

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

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

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

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

毋庸置疑,两个dataSouce

  1. <bean id="dataSourceSig" class="org.apache.commons.dbcp.BasicDataSource"
  2. destroy-method="close">
  3. <property name="driverClassName" value="${datasource.driver}" />
  4. <property name="url" value="${datasource.sig.url}" />
  5. <property name="username" value="${datasource.username}" />
  6. <property name="password" value="${datasource.password}" />
  7. <property name="initialSize" value="${datasource.initialSize}"></property>
  8. <property name="maxActive" value="${datasource.maxActive}"></property>
  9. <property name="maxIdle" value="${datasource.maxIdle}"></property>
  10. <property name="minIdle" value="${datasource.minIdle}"></property>
  11. <property name="maxWait" value="${datasource.maxWait}"></property>
  12. </bean>
  13.  
  14. <bean id="dataSourceSim" class="org.apache.commons.dbcp.BasicDataSource"
  15. destroy-method="close">
  16. <property name="driverClassName" value="${datasource.driver}" />
  17. <property name="url" value="${datasource.sim.url}" />
  18. <property name="username" value="${datasource.username}" />
  19. <property name="password" value="${datasource.password}" />
  20. <property name="initialSize" value="${datasource.initialSize}"></property>
  21. <property name="maxActive" value="${datasource.maxActive}"></property>
  22. <property name="maxIdle" value="${datasource.maxIdle}"></property>
  23. <property name="minIdle" value="${datasource.minIdle}"></property>
  24. <property name="maxWait" value="${datasource.maxWait}"></property>
  25. </bean>

然后配置自己实现的com.iquant.signal.configer.DynamicDataSource类,需指定默认的数据源,如使用其他再进行切换

  1. <bean id="dataSource" class="com.iquant.signal.configer.DynamicDataSource">
  2. <property name="targetDataSources">
  3. <map key-type="java.lang.String">
  4. <entry value-ref="dataSourceSig" key="dataSourceSig"></entry>
  5. <entry value-ref="dataSourceSim" key="dataSourceSim"></entry>
  6. </map>
  7. </property>
  8. <!-- 默认使用dataSourceSig的数据源 -->
  9. <property name="defaultTargetDataSource" ref="dataSourceSig"></property>
  10. </bean>

sqlSession和事物和之前一样,不用改动,实现DynamicDataSource类

  1. public class DynamicDataSource extends AbstractRoutingDataSource {
  2. @Override
  3. protected Object determineCurrentLookupKey() {
  4. return DataSourceContextHolder.getDBType();
  5. }
  6. }

继承AbstractRoutingDataSource 重写determineCurrentLookupKey方法

实现DataSourceContextHolder类

  1. public class DataSourceContextHolder {
  2. private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
  3.  
  4. public static void setDBType(String dbType) {
  5. contextHolder.set(dbType);
  6. }
  7.  
  8. public static String getDBType() {
  9. return ((String) contextHolder.get());
  10. }
  11.  
  12. public static void clearDBType() {
  13. contextHolder.remove();
  14. }
  15. }

到此,多数据源就配置完成,如果想切换数据源,在代码操作对应数据库之前,加上此句代码

  1. //注意这里在调用service前切换到dataSourceSim的数据源
  2. // 经过测试可以写到serice层
  3. DataSourceContextHolder.setDBType("dataSouceSim");
  4. // 若要切换其他数据源,可能要想进行cleanDBType操作
  5. DataSourceContextHolder.cleanDBType();
  6. // 然后再对其他数据源进行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. Windows平台安装TensorFlow Q&A

    ·本文讲的是Windows平台使用原生pip进行TensorFlow(CPU版本)安装的注意事项及常见问题解决方法 ·这是TensorFlow官网的安装介绍:在 Windows 上安装 TensorF ...

  2. B-Tree和B+Tree的区别

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...

  3. os与sys模块

    os 1.os.pardir #获取当前目录的父目录字符串名:('..') 2.os.mkdir('dirname') #创建单级目录:相当于shell中mkdir dirname 3.os.make ...

  4. UOJ#449. 【集训队作业2018】喂鸽子(期望dp)

    题意 有 \(n\) 只鸽子,每只鸽子需要 \(k\) 粒玉米才能喂饱.问每次随意喂给 \(n\) 个鸽子中的一个,期望多久所有鸽子都被喂饱. 对于 \(998244353\) 取模. 数据范围 \( ...

  5. python3 while-else和for-else语法

    while-else: while判断条件不成立时,执行else语句: 语法: while 判断条件: 语句1.... else: 语句2.... i初始值为2,i>0成立,则执行while语句 ...

  6. django集成celery

    Celery是一个基于分布式消息传递的开源异步任务队列,在django实际应用场景下,往往有一些较为耗时,但并不需要返回值的任务, 例如发送邮件,更新我们自己的统计数据库,这时我们可以将这些任务交由c ...

  7. HTTP与HTTPS(转)

    一.什么是HTTP? 什么是HTTPS?  HTTP:(Hyper Text Transfer Protocol 超文本传输协议) HTTPS:(Hyper Text Transfer Protoco ...

  8. Python 下划线

    单下划线 "单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和自类对象自己能访问到这些变量. 例子:以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口 ...

  9. boto3库限速

    # -*- coding: utf-8 -*- import boto3 from boto3.s3.transfer import TransferConfig # from s3transfer. ...

  10. JavaEEspring整理

    Spring框架—控制反转(IOC)            1 Spring框架概述                    1.1 什么是Spring                    1.2 S ...