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

撸码识途      2022-04-16     610

关键词:

前几天有个需求,需要使用不同的数据源,例如某业务要用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+注解的方式实现控制,方法多多!

 


springboot主从数据源动态切换

1.配置了主从同步以后,写操作对应主库,读操作对应从库2.主从数据源自动切换的方式一般有两种,使用注解的方式和拦截器形式。注解的形式是人为在service上添加注解,指定本次操作采用的数据源,拦截器指的是mybatis的拦截... 查看详情

mybatis(springboot集成mybatis,拦截器实现动态sql)

...我们这个项目中是如何对mybatis动态生成sql进行改进的吧springboot在配置了MapperScan之后会自动扫描相关的包,并对有@Mapper标记的类进行注册@Configuration@EnableAutoConfiguration@ServletComponentScan@ComponentScan("xxxx.scm","xxxxx.base")@M 查看详情

浅谈mybatis动态数据源切换是如何实现的(代码片段)

前言小憩是辣么的让人神往,就像备战高考靠窗位置的那个你,肆无忌道的放空自己,望着深蓝色宁静的天空,思考着未来该何去何从,近处一颗高大魁梧的银杏树在炎炎夏日中尽情的摇曳着自己嫩绿的枝丫&#... 查看详情

spring+mybatis项目实现动态切换数据源

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

springboot+mybatis多数据源切换

由于公司业务划分了多个数据库,开发一个项目会同事调用多个库,经过学习我们采用了注解+aop的方式实现的1.首先定义一个注解类@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public@interfaceTargetDataSource{ Stringvalue();//此处接收... 查看详情

springboot根据用户id切换动态数据源代码实现(代码片段)

首先在application.yml文件添加一下配置 #每个库可连接最大用户数dynamic-server:#每个服务最大建库数database-max-number:30#每个库最大用户连接数user-max-number:200template:gis_template然后项目中添加 dynamicds模块的代码,仅展示模块文件目... 查看详情

基于spring+mybatis+atomikos+jta实现分布式事务-动态切换数据源

本文介绍基于spring+mybatis+atomikos+jta实现分布式事务,由程序动态切换数据源,通过atomikos可实现分布式事务一致性。版本:spring-3.2.9.RELEASE、mybatis-3.4.4、atomikos-4.0.5、jdk1.81,maven配置文件pom.xml如下:<!--test--><dependency><g... 查看详情

springboot+aop实现多数据源动态切换

      SpringBoot+aop实现多数据源动态切换 一、多数据源动态切换原理项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此;又例如:读写分离数据库配置的系统。1、多数据源设置... 查看详情

springboot环境配置(profile)切换

SpringBoot集成教程SpringBoot介绍SpringBoot开发环境搭建(Eclipse)SpringBootHelloWorld(restful接口)例子springboot连接Mysqlspringboot配置druid连接池连接mysqlspringboot集成mybatis(1)springboot集成mybatis(2)–使用pagehelper实现分页springboot集 查看详情

mybatis-plus@ds实现动态切换数据源应用(代码片段)

...库分析解决3原因解析1@DS实现动态切换数据源原理首先mybatis-plus使用com.baomidou.dynamic.datasource.AbstractRoutingDataSource继承AbstractDataSource接管数据源;具体实现类为com.baomidou.dynamic.datasource.DynamicRoutingDataSource。项目初始化调用publi... 查看详情

springboot动态数据源切换

    在实际开发过程中,可能有这样的情况,一个项目涉及到多个数据库.有的数据需要插入这个数据库,而有的数据需要插入到另一个数据库里面.所以接下来,就来教大家怎么用最简单的方式来实现这一需求.    我们将会用Spring... 查看详情

springboot实现读取多数据源datasource的动态切换(代码片段)

一配置操作1.1工程结构1.2 pom文件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSche 查看详情

springboot+mybatis实现数据库读写分离

本文不包含数据库主从配置。实现思路:在项目中配置多数据源,通过代码控制访问哪一个数据源。spring-jdbc为我们提供了AbstractRoutingDataSource,DataSource的抽象实现,基于查找键,返回不通不同的数据源。编写我们自己的动态数... 查看详情

springboot:实现mybatis动态创建表(代码片段)

在有些应用场景中,我们会有需要动态创建和操作表的需求。比如因为单表数据存储量太大而采取分表存储的情况,又或者是按日期生成日志表存储系统日志等等。这个时候就需要我们动态的生成和操作数据库表了。而... 查看详情

mybatis动态批量插入更新mysql数据库的通用实现方案

...,关于数据源的切换可以参考之前的文章《spring+springMVC+Mybatis架构下采用AbstractRoutingDataSource、atomikos、JTA实 查看详情

springboot与动态多数据源切换(代码片段)

本文简单的介绍一下基于SpringBoot框架动态多数据源切换的实现,采用主从配置的方式,配置master、slave两个数据库。一、配置主从数据库spring:datasource:type:com.alibaba.druid.pool.DruidDataSourcedriverClassName:com.mysql.cj.jdbc.Driverdruid:#主库数据... 查看详情

springboot动态数据源(多数据源自动切换)

...的方法使用,本文基于注解和AOP的方法实现,在springboot框架的项目中,添加本文实现的代码类后,只需要配置好数据源就 查看详情

springboot集成mybatis动态多数据源后,mybatisplus的ipage失效的问题解决方案

背景之前做数据抽取的时候,搭了一个mybatis动态数据源切换的架子。方便他们写抽取的代码。今天同事问我,架子里面的mybatisplus的IPage失效了是什么问题。想了一下,应该是写动态数据源的时候,我自定义的mybatis的配置覆盖了... 查看详情