最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成ShardingSphere-JDBC實現(xiàn)分庫分表

 更新時間:2025年07月17日 09:34:25   作者:喜之郎XX果凍  
本文主要介紹了SpringBoot集成ShardingSphere-JDBC實現(xiàn)分庫分表,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言:該文章目前只基本實現(xiàn)分庫分表,如需更復雜功能請移步官方文檔,后續(xù)會出復雜實現(xiàn)的筆記,如有需要請關(guān)注留言

一、ShardingSphere-JDBC 概述

作用之一:實現(xiàn)分庫分表存儲

ShardingSphere-JDBC 是 Apache ShardingSphere 的輕量級解決方案,定位為增強型 JDBC 驅(qū)動。它以 jar 包形式存在于應用程序中,通過實現(xiàn) DataSource 接口,對上層應用提供透明的分庫分表能力,與應用程序共享同一個 JVM 進程。

1. 核心特性

  • 分庫分表:支持水平分庫、水平分表、垂直分庫等多種分片模式。
  • 讀寫分離:支持主從復制架構(gòu)下的讀寫分離。
  • 分布式事務:提供 XA 和柔性事務支持。
  • 數(shù)據(jù)加密:支持敏感數(shù)據(jù)透明加密。
  • 影子庫:支持灰度發(fā)布和數(shù)據(jù)驗證。

2. 與其他中間件對比

類型優(yōu)點缺點
ShardingSphere-JDBC無額外部署成本,輕量級,性能損耗小與應用綁定,升級維護需修改代碼
ShardingSphere-Proxy對應用透明,支持異構(gòu)語言,獨立部署需要額外運維,性能略低于 JDBC
MyCat/Atlas成熟穩(wěn)定,社區(qū)活躍功能不如 ShardingSphere 全面

二、集成前項目架構(gòu)(單數(shù)據(jù)源)

1. 依賴配置

<!-- MyBatis-Plus 依賴 -->
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.4.3.4</version>
</dependency>
<!-- HikariCP 連接池 -->
<dependency>
  <groupId>com.zaxxer</groupId>
  <artifactId>hikari-cp</artifactId>
</dependency>
<!-- MySQL 驅(qū)動 -->
<dependency>
  <groupId>com.mysql</groupId>
  <artifactId>mysql-connector-j</artifactId>
  <scope>runtime</scope>
</dependency>

2.配置文件 (application.yml)

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/enterprise_practical_project
    username: root
    password: qwer123456
    hikari:
      maximum-pool-size: 15
      minimum-idle: 5
      connection-timeout: 30000
mybatis-plus:
  mapper-locations: classpath:cn/jjcoder/mapper/*.xml
  type-aliases-package: cn.jjcoder.entity
  configuration:
    map-underscore-to-camel-case: true

3. MyBatis-Plus 配置類

@Configuration
public class MyBatisPlusConfig {


    //插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        factory.setMapperLocations(new PathMatchingResourcePatternResolver()
                                   .getResources("classpath:cn/jjcoder/mapper/*.xml"));
        return factory.getObject();
    }
}

4. 架構(gòu)特點

  • 應用直接連接單一數(shù)據(jù)庫。
  • MyBatis-Plus 直接管理數(shù)據(jù)源。
  • 所有表存儲在同一個數(shù)據(jù)庫實例中。

三、集成后項目架構(gòu)(ShardingSphere-JDBC)

1. 新增依賴

<!-- ShardingSphere-JDBC 核心依賴 -->
<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/sharding-jdbc-spring-boot-starter -->
<dependency>
  <groupId>org.apache.shardingsphere</groupId>
  <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
  <version>5.1.2</version>
  <exclusions>
    <!-- 排除Druid自動配置 -->
    <exclusion>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
    </exclusion>
    <!-- 排除任務調(diào)度器 -->
    <exclusion>
      <groupId>org.apache.shardingsphere</groupId>
      <artifactId>shardingsphere-schedule-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>

2. 配置文件變更

spring:
    shardingsphere:
    # 公共數(shù)據(jù)源配置(錨點)
    common-ds: &common-ds
      type: com.zaxxer.hikari.HikariDataSource
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: qwer123456
      hikari:
        minimum-idle: 5
        maximum-pool-size: 15
        idle-timeout: 30000

    datasource:
      names: main_db,ds2025
      main_db:
        <<: *common-ds  # 引用公共配置
        jdbc-url: jdbc:mysql://localhost:3306/enterprise_practical_project
      ds2025:
        <<: *common-ds
        jdbc-url: jdbc:mysql://localhost:3306/shard_db_2025
#      ds2026:
#        <<: *common-ds
#        jdbc-url: jdbc:mysql://localhost:3306/shard_db_2026
    rules:
      sharding:
        tables:
          standing_book:
            actual-data-nodes: ds$->{2025..2026}.standing_book_$->{202501..202512}
            database-strategy:
              standard:
                sharding-column: in_out_date
                sharding-algorithm-name: db-interval
            table-strategy:
              standard:
                sharding-column: in_out_date
                sharding-algorithm-name: table-interval
        sharding-algorithms:
          db-interval:
            type: INTERVAL
            props:
              datetime-pattern: "yyyy-MM-dd"
              datetime-lower: '2025-01-01'
              datetime-upper: '2026-12-31'
              sharding-suffix-pattern: 'yyyy'
              datetime-interval-amount: 1
              datetime-interval-unit: years
          table-interval:
            type: INTERVAL
            props:
              datetime-pattern: "yyyy-MM-dd"
              datetime-lower: '2025-01-01'
              datetime-upper: '2026-12-31'
              sharding-suffix-pattern: 'yyyyMM'
              datetime-interval-amount: 1
              datetime-interval-unit: months
              datetime-format-pattern: ^\d{4}-\d{2}-\d{2}$
    
mybatis-plus:
  mapper-scan:
    base-package: cn.jjcoder.mapper
  global-config:
    db-config:
      logic-delete-field: deleted # 全局邏輯刪除字段名
      logic-delete-value: 1 # 邏輯已刪除值
      logic-not-delete-value: 0 # 邏輯未刪除值
  configuration:
    # 配置下劃線與駝峰之間轉(zhuǎn)換
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:cn.jjcoder.mapper/*.xml
  type-aliases-package: cn.jjcoder.entity
    

3. MyBatis-Plus 配置類

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);// 注入的是 ShardingSphere 的數(shù)據(jù)源
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                                          .getResources("classpath:cn/jjcoder/mapper/*.xml"));
        return sessionFactory.getObject();
    }

    /**
     * 使用 ShardingSphere 時,事務管理器需要指向 ShardingSphere 的數(shù)據(jù)源:
     * @param dataSource
     * @return
     */
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

4. 架構(gòu)特點

  • 應用通過 ShardingSphere-JDBC 連接多個數(shù)據(jù)庫。
  • ShardingSphere 管理多個物理數(shù)據(jù)源,向上層(MP)提供統(tǒng)一的邏輯數(shù)據(jù)源。
  • MyBatis-Plus 操作 ShardingSphere 提供的邏輯數(shù)據(jù)源,無需感知底層分片細節(jié)。
  • 分片規(guī)則完全由 ShardingSphere 配置控制。

四、集成后效果演示

通過插入數(shù)據(jù)來演示 mybatis-plus 和ShardingSphere之間的工作流程分庫分表

前言:我目前在 application.yml 配置文件中配置的需要分庫分表的表為 standing_book(臺賬表),并且配好了多數(shù)據(jù)源的連接信息,以及具體的分片算法。所以在此之前需要保證數(shù)據(jù)庫有相應的庫和表,以及表的分片鍵類型(這點我在剛開始做的時候沒注意,后續(xù)出了bug排查了好久)

保證以上之后,演示分庫分表具體效果:

由于分庫分表的表為standing_book,所以需給這個表插入數(shù)據(jù)才能觸發(fā),目前我的業(yè)務邏輯為 產(chǎn)品出入庫時生成臺賬信息保存數(shù)據(jù)庫

  • 往 standing_book 插入數(shù)據(jù)代碼
/**
     * 根據(jù)商品出入庫生成臺賬
     * @param list
     * @return
     */
    @Override
    public boolean saveByProductInOrOut(List<ProductVO> list, String userName, boolean isIn) {
        String operationType = isIn ? "入庫" : "出庫";

        List<StandingBook> standingBooks = new ArrayList<>();
        for (ProductVO vo : list) {
            StandingBook standingBook = new StandingBook();
            standingBook.setProductId(vo.getId());   //產(chǎn)品id
            standingBook.setProductName(vo.getName()); //產(chǎn)品名稱
            standingBook.setOperationType(operationType);  //操作類型
            standingBook.setOperationNum(vo.getInOrOutCount());  //入庫or出庫數(shù)量
            Integer newQuantity=isIn? vo.getInventory()+vo.getInOrOutCount() : vo.getInventory()-vo.getInOrOutCount();
            standingBook.setNewQuantity(newQuantity);  //出入庫后庫存總量
            standingBook.setOrperator(userName);
            standingBook.setCreateDatetime(LocalDateTime.now());
            standingBook.setInOutDate(LocalDate.now().toString());  //設置分片鍵值(shardingsphere會根據(jù)該字段值進行分片,路由到相應的庫表)
            standingBooks.add(standingBook);
        }
        //該 saveOrUpdateBatchCustom 將會觸發(fā)分庫分表算法
        return this.saveOrUpdateBatchCustom(standingBooks);

    }
  • 控制臺執(zhí)行信息如下
# mybatis-plus生成的sql
2025-05-20 20:06:48.308 DEBUG --- [onPool-worker-9] c.j.mapper.StandingBookMapper.insert     : ==>  Preparing: INSERT INTO standing_book ( standing_book_id, product_id, product_name, operation_type, in_out_date, orperator, operation_num, new_quantity, create_datetime ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
2025-05-20 20:06:48.316 DEBUG --- [onPool-worker-9] c.j.mapper.StandingBookMapper.insert     : ==> Parameters: f1feb93be82375630ce8f4c3a8e006f8(String), 1dbcf56794cc1cc21ea12719ea7b7a86(String), 6(String), 入庫(String), 2025-05-20(String), root(String), 1(Integer), 35(Integer), 2025-05-20T20:06:48.307(LocalDateTime)

                                                                                                                                                                                                                                                                                                             # 被ShardingSphere接管()
                                                                                                                                                                                                                                                                                                             # 邏輯sql
2025-05-20 20:06:48.322  INFO --- [onPool-worker-9] ShardingSphere-SQL                       : Logic SQL: INSERT INTO standing_book  ( standing_book_id,
                                                                                                                                       product_id,
                                                                                                                                       product_name,

                                                                                                                                       operation_type,
                                                                                                                                       in_out_date,
                                                                                                                                       orperator,
                                                                                                                                       operation_num,
                                                                                                                                       new_quantity,
                                                                                                                                       create_datetime )  VALUES  ( ?,
?,
?,

?,
?,
?,
?,
?,
? )
2025-05-20 20:06:48.322  INFO --- [onPool-worker-9] ShardingSphere-SQL                       : SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty)
# 實際執(zhí)行sql
2025-05-20 20:06:48.322  INFO --- [onPool-worker-9] ShardingSphere-SQL                       : Actual SQL: ds2025 ::: INSERT INTO standing_book_202505  ( standing_book_id,
                                                                                                                                                          product_id,
                                                                                                                                                          product_name,

                                                                                                                                                          operation_type,
                                                                                                                                                          in_out_date,
                                                                                                                                                          orperator,
                                                                                                                                                          operation_num,
                                                                                                                                                          new_quantity,
                                                                                                                                                          create_datetime )  VALUES  (?, ?, ?, ?, ?, ?, ?, ?, ?) ::: [f1feb93be82375630ce8f4c3a8e006f8, 1dbcf56794cc1cc21ea12719ea7b7a86, 6, 入庫, 2025-05-20, root, 1, 35, 2025-05-20T20:06:48.307]

通過以上控制臺輸出可以看到

  • mybatis-plus依舊會生成預編譯sql,但是被shardingsphere接管
  • 可以看到 shardingsphere 的邏輯sql 和實際執(zhí)行sql
    • 實際執(zhí)行sql上顯示了具體路由到的庫和表

具體執(zhí)行流程如下:

  1. 應用代碼調(diào)用:Service 層調(diào)用 Mapper 接口方法。
  2. MyBatis-Plus 處理:
    ■ 通過 SqlSessionFactory 獲取 SqlSession。
    ■ 生成 SQL 語句。
  3. ShardingSphere 攔截:
    ■ ShardingDataSource 攔截 SQL 執(zhí)行請求。
    ■ 根據(jù)分片規(guī)則計算目標庫表。
    ■ 路由 SQL 到對應的物理數(shù)據(jù)源和表。
  4. 數(shù)據(jù)庫執(zhí)行:實際執(zhí)行 SQL 并返回結(jié)果。
  5. 結(jié)果返回:結(jié)果通過 ShardingSphere 封裝后返回給 MyBatis-Plus,MyBatis-Plus 將結(jié)果映射為 Java 對象返回給應用。

五、配置加載與協(xié)作流程

1. 配置加載順序

  1. Spring Boot 啟動:加載 application.yml 配置文件。
  2. ShardingSphere 自動配置
    • ShardingSphereAutoConfiguration 類解析 spring.shardingsphere 配置。
    • 創(chuàng)建多個物理數(shù)據(jù)源(HikariCP 連接池)。
    • 根據(jù)分片規(guī)則創(chuàng)建 ShardingDataSource(實現(xiàn) DataSource 接口)。
    • 將 ShardingDataSource 注冊為 Spring 容器中的唯一 DataSource Bean。
  3. MyBatis-Plus 自動配置
    • MybatisPlusAutoConfiguration 類自動加載。
    • 注入 ShardingSphere 提供的 DataSource Bean。
    • 創(chuàng)建 SqlSessionFactory 和其他 MyBatis 組件。

2. 核心組件初始化過程

ShardingSphere 初始化:

ShardingSphereAutoConfiguration
  → 解析配置文件
  → 創(chuàng)建多個 HikariDataSource 實例
  → 根據(jù)分片規(guī)則創(chuàng)建 ShardingRule
  → 將數(shù)據(jù)源和規(guī)則組裝為 ShardingDataSource
  → 注冊 ShardingDataSource 到 Spring 容器

MyBatis-Plus 初始化:

MybatisPlusAutoConfiguration
  → 從 Spring 容器獲取唯一的 DataSource Bean(即 ShardingDataSource)
  → 創(chuàng)建 MybatisSqlSessionFactoryBean
  → 設置數(shù)據(jù)源、映射文件路徑等配置
  → 初始化 SqlSessionFactory
  → 注冊 MyBatis 的 MapperScanner

3. SQL 執(zhí)行協(xié)作流程

  1. 應用代碼調(diào)用:Service 層調(diào)用 Mapper 接口方法。
  2. MyBatis-Plus 處理
    • 通過 SqlSessionFactory 獲取 SqlSession。
    • 生成 SQL 語句。
  3. ShardingSphere 攔截
    • ShardingDataSource 攔截 SQL 執(zhí)行請求。
    • 根據(jù)分片規(guī)則計算目標庫表。
    • 路由 SQL 到對應的物理數(shù)據(jù)源和表。
  4. 數(shù)據(jù)庫執(zhí)行:實際執(zhí)行 SQL 并返回結(jié)果。
  5. 結(jié)果返回:結(jié)果通過 ShardingSphere 封裝后返回給 MyBatis-Plus,MyBatis-Plus 將結(jié)果映射為 Java 對象返回給應用。

六、集成前后代碼對比

1. 依賴對比

  • 集成前
    • 項目僅依賴 MyBatis-Plus、HikariCP 連接池和 MySQL 驅(qū)動,聚焦于單數(shù)據(jù)源下的數(shù)據(jù)庫操作與對象關(guān)系映射。
  • 而集成 ShardingSphere-JDBC 后
    • 新增了 ShardingSphere-JDBC 核心依賴,此依賴引入分庫分表等關(guān)鍵功能,使得項目具備處理多數(shù)據(jù)源和復雜數(shù)據(jù)分布的能力。
對比維度集成前集成后
核心依賴變化僅包含 MyBatis-Plus 及基礎數(shù)據(jù)庫連接依賴新增 ShardingSphere-JDBC 核心依賴,構(gòu)建多數(shù)據(jù)源處理能力
功能擴展支持單數(shù)據(jù)源下的常規(guī)數(shù)據(jù)庫操作與對象映射新增分庫分表、讀寫分離、分布式事務等高級功能

2. 配置文件對比

在數(shù)據(jù)源配置部分

  • 集成前
    • 采用傳統(tǒng)的 spring.datasource 配置單一數(shù)據(jù)源,簡潔明了地定義驅(qū)動、URL、用戶名和密碼等信息。
  • 集成后,
    • 數(shù)據(jù)源配置轉(zhuǎn)移到 spring.shardingsphere.datasource 下,不僅需定義多個物理數(shù)據(jù)源,還需配置各數(shù)據(jù)源的詳細參數(shù),如連接池設置。
    • 此外,新增的 spring.shardingsphere.rules 用于配置復雜的分庫分表規(guī)則,涵蓋數(shù)據(jù)節(jié)點分布、分片策略和算法,以實現(xiàn)數(shù)據(jù)的合理分片存儲與高效訪問。
對比維度集成前集成后
數(shù)據(jù)源配置位置spring.datasource,配置單一數(shù)據(jù)源spring.shardingsphere.datasource,配置多個物理數(shù)據(jù)源
配置復雜度簡單定義驅(qū)動、URL、用戶名和密碼等基本信息除基本信息外,還需配置多個數(shù)據(jù)源連接池參數(shù),以及分庫分表規(guī)則
新增配置項spring.shardingsphere.rules,用于定義分庫分表規(guī)則,包括數(shù)據(jù)節(jié)點、分片策略和算法

3. 代碼邏輯對比

從數(shù)據(jù)訪問層代碼邏輯來看

  • 集成前
    • MyBatis-Plus 直接操作單一數(shù)據(jù)源,開發(fā)人員無需關(guān)注數(shù)據(jù)源的復雜性,可專注于業(yè)務 SQL 編寫和對象映射。
  • 集成后
    • 雖然 MyBatis-Plus 的 Mapper 接口和業(yè)務代碼在形式上未發(fā)生明顯變化,但實際上,MyBatis-Plus 操作的已變?yōu)?ShardingSphere 提供的邏輯數(shù)據(jù)源。
    • ShardingSphere 會在底層自動處理 SQL 路由,根據(jù)分庫分表規(guī)則將 SQL 準確發(fā)送到對應的物理數(shù)據(jù)源和表,開發(fā)人員無需手動處理復雜的路由邏輯,降低了開發(fā)難度和出錯概率。
對比維度集成前集成后
數(shù)據(jù)訪問方式MyBatis-Plus 直接操作單一數(shù)據(jù)源,簡單直觀MyBatis-Plus 操作 ShardingSphere 提供的邏輯數(shù)據(jù)源,底層自動處理 SQL 路由
開發(fā)關(guān)注點專注于業(yè)務 SQL 編寫和對象映射無需關(guān)注復雜的 SQL 路由邏輯,專注業(yè)務邏輯,由 ShardingSphere 處理數(shù)據(jù)分片
代碼改動無明顯代碼改動無明顯代碼改動,僅配置變化,對業(yè)務代碼透明

4. 架構(gòu)設計對比

在架構(gòu)層面

  • 集成前
    • 項目架構(gòu)簡單,應用與單一數(shù)據(jù)庫直接相連,數(shù)據(jù)處理邏輯集中在單庫內(nèi),適用于數(shù)據(jù)規(guī)模較小、業(yè)務邏輯相對簡單的場景。
  • 集成后
    • 引入 ShardingSphere-JDBC 使架構(gòu)轉(zhuǎn)變?yōu)閼猛ㄟ^ ShardingSphere 連接多個數(shù)據(jù)庫,形成分布式數(shù)據(jù)存儲架構(gòu)。
    • ShardingSphere 作為中間層,管理多個物理數(shù)據(jù)源,向上提供統(tǒng)一的邏輯數(shù)據(jù)源,實現(xiàn)數(shù)據(jù)的分布式存儲與訪問,提升了系統(tǒng)的擴展性和性能,以應對大規(guī)模數(shù)據(jù)和高并發(fā)訪問的挑戰(zhàn)。
對比維度集成前集成后
數(shù)據(jù)庫連接關(guān)系應用直接連接單一數(shù)據(jù)庫,架構(gòu)簡單應用通過 ShardingSphere-JDBC 連接多個數(shù)據(jù)庫,形成分布式架構(gòu)
數(shù)據(jù)管理方式單庫內(nèi)數(shù)據(jù)處理,邏輯集中ShardingSphere 管理多個物理數(shù)據(jù)源,實現(xiàn)數(shù)據(jù)分片存儲與統(tǒng)一訪問
架構(gòu)擴展性擴展性有限,難以應對大規(guī)模數(shù)據(jù)和高并發(fā)擴展性增強,可通過增加數(shù)據(jù)源應對數(shù)據(jù)增長和高并發(fā)需求

七、關(guān)鍵注意事項

1. 數(shù)據(jù)源唯一性

(以下配置如果你是以代碼形式配置數(shù)據(jù)源的話這么配置,如果是在application.yml中配置需在配置文件配置)

確保 Spring 容器中只有一個 DataSource Bean,即 ShardingSphere 提供的 ShardingDataSource。如果存在多個 DataSource Bean,需要通過 @Primary 注解明確指定主數(shù)據(jù)源。

若項目中存在多個數(shù)據(jù)源配置,需顯式指定 ShardingSphere 的數(shù)據(jù)源為主要數(shù)據(jù)源:

示例代碼

@Configuration
public class DataSourceConfig {
    // 假設存在多個數(shù)據(jù)源 Bean
    @Bean
    @Primary // 指定 ShardingSphere 的數(shù)據(jù)源為主要數(shù)據(jù)源
    public DataSource shardingDataSource() throws SQLException {
        // 從 ShardingSphere 配置構(gòu)建數(shù)據(jù)源
        return ShardingSphereDataSourceFactory.createDataSource(createShardingRuleConfiguration());
    }
    // 其他數(shù)據(jù)源 Bean(非主要)
    @Bean
    public DataSource anotherDataSource() {
        // 配置其他數(shù)據(jù)源
        return DataSourceBuilder.create().build();
    }
    // 構(gòu)建 ShardingSphere 分片規(guī)則配置
    private ShardingRuleConfiguration createShardingRuleConfiguration() {
        // 配置分片規(guī)則...
    }
}

2. 事務管理

在使用ShardingSphere的分布式事務支持時,可通過配置事務類型屬性來選擇事務模式。例如,若采用XA強一致性事務,可在application.yml中添加spring.shardingsphere.props.transaction.type=XA配置;若選擇柔性事務(如基于最大努力送達型的事務),則需結(jié)合具體業(yè)務場景,合理配置補償策略和消息隊列等組件,確保事務最終一致性。

對于跨庫事務,需要使用分布式事務管理器,如 Seata 或 ShardingSphere 自身提供的分布式事務支持:

spring:
  shardingsphere:
    props:
      xa-transaction-manager-type: atomikos  # 使用 Atomikos XA 事務管理器

3. SQL 限制

分庫分表場景下,部分復雜 SQL 可能無法執(zhí)行,如:

  • 跨庫關(guān)聯(lián)查詢。
  • 跨庫聚合函數(shù)(如 COUNT、SUM)。
  • 分布式主鍵生成。

4. 性能監(jiān)控

ShardingSphere 提供內(nèi)置的 SQL 監(jiān)控功能,可以通過配置開啟:

spring:
  shardingsphere:
    props:
      sql-show: true  # 打印 SQL
      metrics-name: prometheus  # 集成 Prometheus 監(jiān)控

八、常見問題與解決方案

1. 啟動時報 “SqlSessionFactory 找不到”

在 MybatisPlusConfig 配置如下bean

@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
    sessionFactory.setDataSource(dataSource);
    sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                                      .getResources("classpath:cn/jjcoder/mapper/*.xml"));
    return sessionFactory.getObject();
}

2. SQL 執(zhí)行異常,表不存在

  • 原因:分片規(guī)則配置錯誤,SQL 路由到不存在的表。
  • 解決方案
    • 檢查 actual-data-nodes 配置是否正確。
    • 確認分片算法和分片鍵配置是否匹配。
    • 確保 actual-data-nodes 中的表名與實際數(shù)據(jù)庫中的表名一致:

3. 事務不生效

  • 原因:跨庫事務需要分布式事務支持。
  • 解決方案:
    • 配置分布式事務管理器(如 Atomikos、Seata)。
    • 使用 @Transactional 注解時指定正確的事務管理器。

配置文件修改示例:

配置 Atomikos XA 事務管理器:

spring:
 shardingsphere:
   props:
     xa-transaction-manager-type: atomikos # 啟用 XA 事務

Java 配置示例

定義分布式事務管理器:

@Configuration
public class TransactionConfig {
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        // 使用 Atomikos 分布式事務管理器
        JtaTransactionManager transactionManager = new JtaTransactionManager();
        transactionManager.setTransactionManager(new UserTransactionManager());
        transactionManager.setUserTransaction(new UserTransactionImp());
        return transactionManager;
    }
}

4. 性能下降明顯

  • 原因:分片規(guī)則不合理或連接池配置不當。
  • 解決方案:
    • 優(yōu)化分片算法,避免數(shù)據(jù)傾斜。
    • 調(diào)整連接池參數(shù)(如 maximum-pool-size)。
    • 開啟 SQL 監(jiān)控,分析慢查詢。

配置文件修改示例:

優(yōu)化 HikariCP 連接池參數(shù):

spring:
   shardingsphere:
    # 公共數(shù)據(jù)源配置(錨點)
    common-ds: &common-ds
      type: com.zaxxer.hikari.HikariDataSource
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: qwer123456
      hikari:
        maximum-pool-size: 30 # 增加最大連接數(shù)
        minimum-idle: 10 # 增加最小空閑連接數(shù)
        idle-timeout: 30000 # 空閑連接超時時間
        max-lifetime: 1800000 # 連接最大生命周期

九、總結(jié)

通過集成 ShardingSphere-JDBC,我們在不修改 MyBatis-Plus 代碼的前提下,實現(xiàn)了數(shù)據(jù)庫的分庫分表能力。這種架構(gòu)既保留了 MyBatis-Plus 的開發(fā)便利性,又通過 ShardingSphere 提升了系統(tǒng)的可擴展性和性能。關(guān)鍵要點包括:

  1. ShardingSphere-JDBC 作為增強型 JDBC 驅(qū)動,對上層應用透明。
  2. 集成后,MyBatis-Plus 操作的是 ShardingSphere 提供的邏輯數(shù)據(jù)源,無需關(guān)心底層分片細節(jié)。
  3. 分片規(guī)則完全通過配置文件控制,無需修改 DAO 層代碼。
  4. 需要注意分布式事務、復雜 SQL 支持等特殊

到此這篇關(guān)于SpringBoot集成ShardingSphere-JDBC實現(xiàn)分庫分表的文章就介紹到這了,更多相關(guān)ShardingSphere-JDBC分庫分表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 使用IDEA創(chuàng)建SpringBoot項目的方法步驟

    使用IDEA創(chuàng)建SpringBoot項目的方法步驟

    這篇文章主要介紹了使用IDEA創(chuàng)建SpringBoot項目的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 使用Java解決斐波那契數(shù)列問題的兩種方法(兔子繁殖問題)

    使用Java解決斐波那契數(shù)列問題的兩種方法(兔子繁殖問題)

    有一個經(jīng)典的數(shù)學問題,稱為斐波那契數(shù)列或兔子繁殖問題,問題是這樣的:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數(shù)為多少?本文介紹了如何使用Java解決問題,需要的朋友可以參考下
    2026-01-01
  • SpringBoot項目中日志管理與調(diào)優(yōu)指南

    SpringBoot項目中日志管理與調(diào)優(yōu)指南

    在 Spring Boot 開發(fā)過程中,日志管理是開發(fā)者必須掌握的重要技能之一,合理的日志配置不僅能幫助開發(fā)者追蹤應用程序的執(zhí)行流程、定位問題,還能提升應用程序的可維護性,本文將詳細探討 Spring Boot 項目中日志管理的常見問題、解決方案以及最佳實踐
    2024-10-10
  • springboot啟動不了也不報錯的問題及解決

    springboot啟動不了也不報錯的問題及解決

    這篇文章主要介紹了springboot啟動不了也不報錯的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • java判斷class子類或父類的實例方法

    java判斷class子類或父類的實例方法

    在本篇文章里小編給大家整理的是關(guān)于java判斷class子類或父類的實例方法,需要的朋友們可以參考學習下。
    2020-02-02
  • Java定時器Timer簡述

    Java定時器Timer簡述

    本文主要介紹了Java定時器Timer的相關(guān)知識,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用詳解

    Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用詳解

    這篇文章主要介紹了Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用?,文中給大家介紹了Jmeter中關(guān)于BeanShell的相關(guān)知識,結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • 詳解SpringBoot中的參數(shù)校驗(項目實戰(zhàn))

    詳解SpringBoot中的參數(shù)校驗(項目實戰(zhàn))

    這篇文章主要介紹了SpringBoot中的參數(shù)校驗,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題及解決方法

    SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題及解決方法

    這篇文章主要介紹了SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題解決方案,通過實例代碼介紹了SpringBoot各個層次的操作,需要的朋友可以參考下
    2022-04-04
  • Java替換字符串replace和replaceAll方法舉例詳解

    Java替換字符串replace和replaceAll方法舉例詳解

    這篇文章主要介紹了Java中替換字符串的幾種方法,包括String類的replace()、replaceAll()、replaceFirst()方法,以及StringBuilder和StringBuffer類的replace()方法,還提到了一些第三方庫,如Hutool,它們提供了更豐富的字符串處理功能,需要的朋友可以參考下
    2025-02-02

最新評論

盱眙县| 荃湾区| 贵溪市| 灌阳县| 那曲县| 石首市| 浪卡子县| 礼泉县| 澎湖县| 延津县| 都安| 崇文区| 冷水江市| 子洲县| 信宜市| 勃利县| 丰顺县| 黄龙县| 丹寨县| 芜湖县| 门源| 达州市| 东平县| 威海市| 民丰县| 陆丰市| 扎赉特旗| 香格里拉县| 永善县| 景东| 榆中县| 敖汉旗| 紫金县| 三原县| 美姑县| 普兰店市| 兴业县| 百色市| 长岭县| 石狮市| 鄂托克前旗|