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/zh-tw/n/144539.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
SDDF的頭像SDDF
上一篇 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

發表回復

登錄後才能評論