spring boot + mybatis实现动态切换数据源实例代码

前言

前几天有个需求,需要使用不同的数据源,例如某业务要用A数据源,另一个业务要用B数据源。我上网收集了一些资料整合了一下,虽然最后这个需求不了了之了,但是多数据源动态切换还是蛮好用的,所以记录一下,或许以后有用呢?或者自己感兴趣又想玩呢!

下面话不多说了,随着小编来一起看看详细的介绍吧

方法如下:

1.加个依赖

 <dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
       <version>1.3.1</version>
 </dependency>

2.application.properties配置文件

#主从数据库
master.db.driverClassName=com.mysql.jdbc.Driver
master.db.url=jdbc:mysql://localhost:3306/cbd?characterEncoding=UTF-8&useUnicode=true&useSSL=false
master.db.username=root
master.db.password=admin
slave.db.driverClassName=com.mysql.jdbc.Driver
slave.db.url=jdbc:mysql://localhost:3306/cbd_test?characterEncoding=UTF-8&useUnicode=true&useSSL=false
slave.db.username=root
slave.db.password=admin

mybatis.config-location= classpath:config/mybatis-config.xml
mybatis.mapper-locations=classpath:mapper/**/*.xml

3.禁用springboot默认加载数据源配置

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {

 public static void main(String[] args) throws Exception {
  SpringApplication.run(Application.class, args);
 }
}

4.数据源配置类

/**
 * 主数据源
 */
@Configuration
@ConfigurationProperties(prefix = "master.db")
public class MasterDataSourceConfig {
 private String url;
 private String username;
 private String password;
 private String driverClassName;
}
/**
 * 从数据源配置
 */
@Configuration
@ConfigurationProperties(prefix = "slave.db")
public class SlaveDataSourceConfig {
 private String url;
 private String username;
 private String password;
 private String driverClassName;
}
/**
 * 数据源配置类
 */
@Configuration
public class DataSourceComponent {

 @Resource
 private MasterDataSourceConfig masterDataSourceConfig;

 @Resource
 private SlaveDataSourceConfig slaveDataSourceConfig;

  @Bean(name = "master")
 public DataSource masterDataSource() {
  DataSource dataSource = new DataSource();
  dataSource.setUrl(masterDataSourceConfig.getUrl());
  dataSource.setUsername(masterDataSourceConfig.getUsername());
  dataSource.setPassword(masterDataSourceConfig.getPassword());
  dataSource.setDriverClassName(masterDataSourceConfig.getDriverClassName());
  return dataSource;
 }

 @Bean(name = "slave")
 public DataSource slaveDataSource() {
  DataSource dataSource = new DataSource();
  dataSource.setUrl(slaveDataSourceConfig.getUrl());
  dataSource.setUsername(slaveDataSourceConfig.getUsername());
  dataSource.setPassword(slaveDataSourceConfig.getPassword());
  dataSource.setDriverClassName(slaveDataSourceConfig.getDriverClassName());
  return dataSource;
 }

 @Primary//不加这个会报错。
 @Bean(name = "multiDataSource")
 public MultiRouteDataSource exampleRouteDataSource() {
  MultiRouteDataSource multiDataSource = new MultiRouteDataSource();
  Map<Object, Object> targetDataSources = new HashMap<>();
  targetDataSources.put("master", masterDataSource());
  targetDataSources.put("slave", slaveDataSource());
  multiDataSource.setTargetDataSources(targetDataSources);
  multiDataSource.setDefaultTargetDataSource(masterDataSource());
  return multiDataSource;
 }
}

5.数据源上下文

/**
 * 数据源上下文
 */
public class DataSourceContext {
 private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

 public static void setDataSource(String value) {
  contextHolder.set(value);
 }

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

 public static void clearDataSource() {
  contextHolder.remove();
 }
}

6.DataSource路由类

/*
* 重写的函数决定了最后选择的DataSource
*/
public class MultiRouteDataSource extends AbstractRoutingDataSource {

 @Override
 protected Object determineCurrentLookupKey() {
  //通过绑定线程的数据源上下文实现多数据源的动态切换,有兴趣的可以去查阅资料或源码
  return DataSourceContext.getDataSource();
 }

}

7.使用,修改上下文中的数据源就可以切换自己想要使用的数据源了。

 public UserVO findUser(String username) {
  DataSourceContext.setDataSource("slave");
  UserVO userVO = userMapper.findByVO(username);
  System.out.println(userVO.getName()+"=====================");
  return null;
 }

这种是在业务中使用代码设置数据源的方式,也可以使用AOP+注解的方式实现控制,方法多多!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • spring实现动态切换、添加数据源及源码分析

    前言 对于数据量在1千万,单个mysql数据库就可以支持,但是如果数据量大于这个数的时候,例如1亿,那么查询的性能就会很低.此时需要对数据库做水平切分,常见的做法是按照用户的账号进行hash,然后选择对应的数据库. 最近公司项目需求,由于要兼容老系统的数据库结构,需要搭建一个 可以动态切换.添加数据源的后端服务. 参考了过去的项目,通过配置多个SqlSessionFactory 来实现多数据源,这么做的话,未免过于笨重,而且无法实现动态添加数据源这个需求 通过 spring AbstractRo

  • Servlet+MyBatis项目转Spring Cloud微服务,多数据源配置修改建议

    一.项目需求 在开发过程中,由于技术的不断迭代,为了提高开发效率,需要对原有项目的架构做出相应的调整. 二.存在的问题 为了不影响项目进度,架构调整初期只是把项目做了简单的maven管理,引入springboot并未做spring cloud微服务处理.但随着项目的进一步开发,急需拆分现有业务,做微服务处理.因此架构上的短板日益突出.spring cloud config 无法完全应用,每次项目部署需要修改大量配置文件.严重影响开发效率,因此便萌生了对项目架构再次调整的决心. 三.调整建议 为了

  • Spring配置多数据源切换

    多数据源切换 db.properties #MySQL jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test?autoReconnect=true&characterEncoding=utf-8 jdbc.username=root jdbc.password=admin #定义初始连接数 initialSize=0 #定义最大连接数 maxActive=1000 #定义最大空闲 maxIdle=2

  • Spring Boot + Mybatis 实现动态数据源案例分析

    动态数据源 在很多具体应用场景的时候,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库.又比如业务A要访问A数据库,业务B要访问B数据库等,都可以使用动态数据源方案进行解决.接下来,我们就来讲解如何实现动态数据源,以及在过程中剖析动态数据源背后的实现原理. 实现案例 本教程案例基于 Spring Boot + Mybatis + MySQL 实现. 数据库设计 首先需要安装好MySQL数据库,新建数据库 master,slave,分别创建用户表,用

  • Spring Boot 2.0多数据源配置方法实例详解

    两个数据库实例,一个负责读,一个负责写. datasource-reader: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://192.168.43.61:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false username: icbc password: icbc driver-class-na

  • Spring Boot+Mybatis+Druid+PageHelper实现多数据源并分页的方法

    前言 本篇文章主要讲述的是SpringBoot整合Mybatis.Druid和PageHelper 并实现多数据源和分页.其中SpringBoot整合Mybatis这块,在之前的的一篇文章中已经讲述了,这里就不过多说明了.重点是讲述在多数据源下的如何配置使用Druid和PageHelper . Druid介绍和使用 在使用Druid之前,先来简单的了解下Druid. Druid是一个数据库连接池.Druid可以说是目前最好的数据库连接池!因其优秀的功能.性能和扩展性方面,深受开发人员的青睐. D

  • springboot v2.0.3版本多数据源配置方法

    本篇分享的是springboot多数据源配置,在从springboot v1.5版本升级到v2.0.3时,发现之前写的多数据源的方式不可用了,捕获错误信息如: 异常:jdbcUrl is required with driverClassName. 先来说下之前的多数据源配置如: spring: datasource: url: jdbc:sqlserver://192.168.122.111;DatabaseName=flight username: sa password: 1234.abc

  • 详解springboot采用多数据源对JdbcTemplate配置的方法

    springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.

  • 通过Spring Boot配置动态数据源访问多个数据库的实现代码

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中也描述了):只适用于数据库数量不多且固定的情况.针对数据库动态增加的情况无能为力. 下面讲的方案能支持数据库动态增删,数量不限. 数据库环境准备 下面一Mysql为例,先在本地建3个数据库用于测试.需要说明的是本方案不限数据库数量,支持不同的数据库部署在不同的服务器上.如图所示db_project_001.d

  • spring+Jpa多数据源配置的方法示例

    今天临下班时遇到了一个需求,我的管理平台需要从不同的数据库中获取数据信息,这就需要进行Spring的多数据源配置,对于这种配置,第一次永远都是痛苦的,不过经历了这次的折磨,今后肯定会对这种配置印象深刻.我们这里简单回顾一下流程. 我们配置了两个数据库,一个是公司的数据库,另一个是我本地的一个数据库.首先是application.yml的配置(其中对于公司的数据库我们采取了假的地址,而本机的数据库是真是存在对应的表和库的) 数据库信息: 数据表信息: 1.application.yml datas

随机推荐