前言:工作中经常会有两个数据源的情况,所以记录一下。这里测试两个数据源,给出流程和代码。

首先:配置两个数据源

    <description>配置mybatis数据源</description><!-- 加载配置文件 --><context:property-placeholder location="classpath*:conf/system/*.properties"/><!-- 需要 commons.dbcp 包 --><bean id="firstDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="${db.driver}"/><property name="url" value="${db.datasourceurl}"/><property name="username" value="${db.username}"/><property name="password" value="${db.password}"/><property name="maxActive" value="100"/><property name="maxIdle" value="20"/><property name="maxWait" value="1000"/><property name="defaultAutoCommit" value="true"/><property name="removeAbandoned" value="true"/><property name="removeAbandonedTimeout" value="60"/><property name="validationQuery" value="select count(*) from dual"/><property name="testOnBorrow" value="true"/><property name="testOnReturn" value="true"/><property name="testWhileIdle" value="true"/></bean><!--数据源二--><bean id="secondDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="${second.db.driver}"/><property name="url" value="${second.db.datasourceurl}"/><property name="username" value="${second.db.username}"/><property name="password" value="${second.db.password}"/><property name="maxActive" value="100"/><property name="maxIdle" value="20"/><property name="maxWait" value="1000"/><property name="defaultAutoCommit" value="true"/><property name="removeAbandoned" value="true"/><property name="removeAbandonedTimeout" value="60"/><property name="validationQuery" value="select count(*) from dual"/><property name="testOnBorrow" value="true"/><property name="testOnReturn" value="true"/><property name="testWhileIdle" value="true"/></bean>

然后写一个数据源持有类

package com.yule.system.datasource;/*** 数据源持有类* @author yule* @date 2018/9/28 19:34*/
public class DataSourceHolder {private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();/*** @Description: 设置数据源类型* @param dataSourceType  数据库类型* @return void* @throws*/public static void setDataSourceType(String dataSourceType) {contextHolder.set(dataSourceType);}/*** @Description: 获取数据源类型* @return String* @throws*/public static String getDataSourceType() {return contextHolder.get();}/*** @Description: 清除数据源类型* @return void* @throws*/public static void clearDataSourceType() {contextHolder.remove();}}

然后:写一个数据源路由类

package com.yule.system.datasource;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/*** 路由类* @author yule* @date 2018/9/28 19:29*/
public class RoutingDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceHolder.getDataSourceType();}
}

然后:配置数据源路由,class指定刚才的路由类

    <!--配置数据源路由--><bean id="dataSource" class="com.yule.system.datasource.RoutingDataSource"><!-- 为targetDataSources注入两个数据源 --><property name="targetDataSources"><map key-type="java.lang.String"><entry key="db1" value-ref="firstDataSource"/><entry key="db2" value-ref="secondDataSource"/></map></property><!-- 为指定数据源RoutingDataSource注入默认的数据源--><property name="defaultTargetDataSource" ref="firstDataSource"/></bean>

然后:配置事务

    <!-- 自动注册service 必须在配置事务之上,否则@Transactional不起作用--><context:component-scan base-package="com.yule"><context:include-filter type="regex" expression=".*\.service\..*" /></context:component-scan><!--配置事务--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 支持注解形式 enable transaction annotation support --><tx:annotation-driven transaction-manager="txManager" />

然后:整合 spring 合 mybatis

    <!-- mybatis为spring提供的jar,其配置时不支持正则表达式配置 --><bean id="mySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="typeAliasesPackage" value="com.yule.*.entity,com.yule.*.*.entity,com.yule.*.*.*.entity"/><property name="configLocation" value="classpath:/mybatis/system/mybatis-configuration.xml"/></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.yule.*.dao,com.yule.*.*.dao,com.yule.*.*.*.dao"/><property name="sqlSessionFactoryBeanName" value="mySqlSessionFactory"/></bean>

最后:使用方法

//获取数据源类型
DataSourceHolder.getDataSourceType();
//设置为 db1 的数据源
DataSourceHolder.setDataSourceType("db1");
//设置为 db2 的数据源
DataSourceHolder.setDataSourceType("db2");

转载于:https://www.cnblogs.com/yuxiaole/p/9720480.html

springmvc 配置多个数据源,并动态切换相关推荐

  1. Spring Boot多数据源配置并通过注解实现动态切换数据源

    文章目录 1. AbstractRoutingDataSource类介绍 2. ThreadLocal类介绍 3. 环境准备 3.1 数据库准备 3.2 项目创建 4. 具体实现 4.1 定义数据源枚 ...

  2. java 动态数据源切换,Java+Spring+MyBatis实现多数据源的动态切换

    在实际的项目开发过程中我们经常会遇到一个项目需要使用多个数据源的情况,而多数据源又可分为固定多数据源和动态多数据源两种情况. 固定多数据源是指在项目中需要使用多个数据源,但数据源的个数是确定的,不会改 ...

  3. JAVA配置多数据源并动态切换

    参考: https://my.oschina.net/simpleton/blog/916108 http://wenqy.com/2017/12/24/spring-boot%E5%AD%A6%E4 ...

  4. java 动态切换数据源_Java动态切换数据源(AOP)

    一.对比 通过中间层来管理数据源,常用的有 mycat 等,但有一个大缺陷,就是性能的损耗,即本身直接请求数据库的事儿,却要经过中间层来进行一次分配的操作,但是,通用性比较高. 而使用客户端模式来管理 ...

  5. springboot结合druid使用多数据源,动态切换

    前言 有时候为了减少数据库的压力,就要实现数据库的读写分离,这种情况往往是读多写少的情况,例如电商平台.既然数据库读写分离了,那么代码层也就需要读写不同的数据库了.实现方法应该有不少,我知道有插件实现 ...

  6. springboot多数据源动态切换和自定义mybatis分页插件

    1.配置多数据源 增加druid依赖 完整pom文件 数据源配置文件 route.datasource.driver-class-name= com.mysql.jdbc.Driver route.d ...

  7. spring boot 切换 oracle 和 mysql_spring-boot多数据源动态切换

    作者:码农教程 出自:码农教程 原文:manongjc.com/detail/14-ucsldoihyzmwcui.html 当项目中存在多数据源时,就涉及到数据源的动态切换,通过研究,特此记录一下. ...

  8. druid 多数据源_Spring Boot + Mybatis 中 配置Druid多数据源并实现自由切换

    概述 前面我们已经介绍过了对MyBatis.Druid的整合,接下来我们在之前的基础上做扩展,实现对Druid多数据源的配置以及动态切换数据源. 问题:多数据源使用场景有哪些呢? 回答:在业务发展中, ...

  9. springboot+mybatis实现动态切换数据源

    目前有个需求,需要使用不同的数据源,例如某业务要用A数据源,另一个业务要用B数据源. 如何在spring框架中解决多数据源的问题 使用springboot 整合多数据源 遇到的坑 1.添加依赖 < ...

最新文章

  1. 刚接触机器学习这一个月我都做了什么?
  2. python小程序源代码-Python数据库小程序源代码
  3. 数据库操作错误:删除对于用户'root':数据库主体在该数据库中拥有架构,无法删除...
  4. 避免强光的一些注意点
  5. 数组按逆向求最大差值的算法
  6. Shell Notes(1)
  7. qt不规则按钮样式在自适应分辨率时应该注意的图片缩放模式
  8. oracle 数据树,ORACLE 树形数据
  9. DELL服务器如何使用iDRAC安装操作系统
  10. 5 python 页面说明_Python爬虫爬取网易云的音乐
  11. 防火墙配置十大任务之五,有NAT的两个接口的配置
  12. Atitit hadoop使用总结 目录 1.1. 下载300m ,解压后800M 1 1.2. 二:需要的jar包 1 2. Demo code 2 2.1. WCMapper 2 2.2. WC
  13. 如何将 Excel 数据分组后按次序横向排列
  14. 如何搭建ftp服务器实现文件共享
  15. Chrome笔试平台 摄像头无法开启 | 摄像头图像黑屏 问题解决
  16. win2008系统漏洞扫描所得的几个漏洞详解
  17. Android进程永生技术终极揭秘:进程被杀底层原理、APP应对技巧
  18. 为师弟师妹们连载(二)
  19. 微服务组件之限流器与熔断器
  20. Python——河神小游戏

热门文章

  1. python在中小学教学中的应用-为什么越来越多人学习python?中小学都要开始了?...
  2. arcgis python工具-使用python制作ArcGIS插件(1)工具介绍
  3. python批量下载文件-python使用selenium实现批量文件下载
  4. python编程从入门到精通pdf-Python编程从入门到精通.pdf
  5. 用python的turtle画圆-Python turtle 绘图画圆
  6. 21天精通python-21天学通Python 完整pdf扫描版[58MB]
  7. python100行代码-怎样写贪吃蛇小游戏?用100行python代码轻松解决!
  8. python好学吗一般要学多久-转行学Python开发难吗,月薪过万需要多久
  9. python面向对象编程的优点-Python面向对象编程——总结面向对象的优点
  10. python代码大全表解释-.python3基础之“术语表(1)”