Mybatis多数据源配置详解

一、Mybatis多数据源配置

在实际开发中,我们常常需要连接多个数据源,此时我们就需要使用Mybatis多数据源配置。下面我们来详细讲解Mybatis多数据源配置。

我们先来看一下如下的两个数据源的配置文件:

spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/test1?characterEncoding=utf-8&useSSL=false
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=root
spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://localhost:3307/test2?characterEncoding=utf-8&useSSL=false
spring.datasource.dynamic.datasource.slave.username=root
spring.datasource.dynamic.datasource.slave.password=root
spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.jdbc.Driver

在Mybatis中,我们可以通过配置文件来指定多个数据源,在其中添加多个数据源配置,例如:

mybatis.mapper-locations=classpath*:com/example/demo/mapper/*.xml
 spring.datasource.dynamic.primary=master
 spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/test1?characterEncoding=utf-8&useSSL=false
 spring.datasource.dynamic.datasource.master.username=root
 spring.datasource.dynamic.datasource.master.password=root
 spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driver
 
 spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://localhost:3307/test2?characterEncoding=utf-8&useSSL=false
 spring.datasource.dynamic.datasource.slave.username=root
 spring.datasource.dynamic.datasource.slave.password=root
 spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.jdbc.Driver

二、Mybatis多数据源打印SQL

Mybatis多数据源配置后,我们可以使用druid提供的日志输出过滤器监控SQL执行情况,具体代码如下:

spring:
  datasource:
    dynamic:
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/test1?characterEncoding=utf8
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
        slave:
          url: jdbc:mysql://localhost:3307/test2?characterEncoding=utf8
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
      druid:
        datasource:
          type: com.alibaba.druid.pool.DruidDataSource
          filter:
            - stat
            - wall
            - log4j
          max-active: 20
          max-wait: 1000
          default-auto-commit: false
          initial-size: 1
          test-while-idle: true
          validation-query: SELECT 'x'
          validation-query-timeout: 2

三、Mybatis多数据源切换

Mybatis多数据源切换可以使用Spring提供的AbstractRoutingDataSource类来实现,具体代码如下:

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSource();
    }
}

通过DataSourceContextHolder的getDataSource()方法获取数据源key,然后切换到对应的数据源。

四、Mybatis多数据源连接池

Mybatis多数据源连接池我们可以使用HikariCP连接池,其配置代码如下:

spring:
  datasource:
    dynamic:
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/test1?characterEncoding=utf8
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
          type: com.zaxxer.hikari.HikariDataSource
          hikari:
            idle-timeout: 60000
            maximum-pool-size: 20
            minimum-idle: 5
            max-lifetime: 1800000
            connection-timeout: 30000
          auto-commit: false
  mybatis:
    mapper-locations: classpath*:mapper/**/*.xml
    type-aliases-package: cn.lyn4ever.pojo
    configuration:
      map-underscore-to-camel-case: true

五、Mybatis多数据源事务管理

Mybatis多数据源事务管理需要我们进行手动编写代码实现事务管理,具体代码如下:

@Service
public class TestService {

    @Autowired
    private CRUDMapper masterCRUDMapper;

    @Autowired
    private CRUDMapper slaveCRUDMapper;

    @Transactional(transactionManager = "dynamicTransactionManager",propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void test1(){
        masterCRUDMapper.insert();
        slaveCRUDMapper.insert();
    }
}

六、Mybatis多数据源切换组件

Mybatis多数据源切换组件可以使用Dynamic DataSource Router,它是一个开源的数据源路由框架,支持针对多个数据源的动态切换,具体代码如下:

public class DataSourceRouter {

    public static final String MASTER = "master";

    public static final String SLAVE = "slave";

    private static final ThreadLocal dataSourceKey = new ThreadLocal();

    private static final List dataSourceKeys = new ArrayList();

    public static void clearDataSourceKey() {
        dataSourceKey.remove();
    }

    public static String getDataSourceKey() {
        return dataSourceKey.get();
    }

    public static List getDataSources() {
        return dataSourceKeys;
    }

    public static void setDataSourceKey(String dataSource) {
        dataSourceKey.set(dataSource);
    }

    public static void setDataSourceKeys(List dataSourceKeys) {
        DataSourceRouter.dataSourceKeys.addAll(dataSourceKeys);
    }

    public static boolean containsDataSource(String dataSource) {
        return dataSourceKeys.contains(dataSource);
    }
}

七、Mybatis多数据源不切库问题

在使用Mybatis多数据源时,可能会遇到不切库(即一直使用默认库进行操作)的问题,此时需要我们注意数据源的key是否一致,具体代码可以通过debug来找到原因。

八、Mybatis多数据源ds不切库问题

在使用Mybatis多数据源时,注意不同的数据源切换之间需要关闭之前的连接资源,否则会出现不能切换到正确的数据源的情况,解决方法可以通过增加Druid多数库连接池的数量来避免这种情况。

九、Mybatis多数据源配置失效

在使用Mybatis多数据源时,可能会遇到每次都默认使用单数据源的情况,此时需要检查代码中的配置是否正确,以及是否进行了相关的配置生效检查。

十、MybatisPlus多数据源配置

MybatisPlus多数据源配置方式与Mybatis相同,只需要在其配置文件中添加多个数据源即可,例如:

spring.datasource.master.url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false
spring.datasource.master.username=root
spring.datasource.master.password=root
spring.datasource.master.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.slave.url=jdbc:mysql://localhost:3307/test2?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false
spring.datasource.slave.username=root
spring.datasource.slave.password=root
spring.datasource.slave.type=com.alibaba.druid.pool.DruidDataSource

以上内容就是我们对于Mybatis多数据源配置的详细阐述,我们可以根据实际需求来选择具体的实现方式,以满足业务需求。

原创文章,作者:SDDF,如若转载,请注明出处:https://www.506064.com/n/144539.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
SDDFSDDF
上一篇 2024-10-25 13:54
下一篇 2024-10-25 13:54

相关推荐

  • 理解Mybatis中的SQL Limit用法

    Mybatis是一种非常流行的ORM框架,提供了SQL映射配置文件,可以使用类似于传统SQL语言的方式编写SQL语句。其中,SQL的Limit语法是一个非常重要的知识点,能够实现分…

    编程 2025-04-29
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25

发表回复

登录后才能评论