欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot 3整合ShardingSphere-Jdbc分庫分表實(shí)戰(zhàn)

 更新時(shí)間:2025年10月28日 10:33:15   作者:荒古廢體  
本文主要介紹了Spring Boot 3整合ShardingSphere-Jdbc分庫分表實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

網(wǎng)上找了很多資料,包括官網(wǎng),使用springboot3shardingsphere-jdbc都無法運(yùn)行,查了GPT和網(wǎng)上搜索,摸索了一晚上,找到了方案。

1. Maven 依賴

<dependencies>
    <!-- ShardingSphere JDBC 核心依賴 -->
     <dependency>
         <groupId>org.apache.shardingsphere</groupId>
         <artifactId>shardingsphere-jdbc</artifactId>
         <version>5.5.2</version>
     </dependency>

    <!-- Druid 數(shù)據(jù)源 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-3-starter</artifactId>
        <version>1.2.27</version>
    </dependency>

    <!-- MySQL 驅(qū)動(dòng) -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.4.0</version>
    </dependency>
    
     <!-- springboot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>3.5.5</version>
    </dependency>
</dependencies>

2. application.yml 配置

新版配置分為了兩個(gè)文件,一個(gè)application.yml,另一個(gè)是sharding-datasource.yml

官網(wǎng)上是這么說的:

1. 首先 application.yml配置

server:
  port: 9090

spring:
  datasource:
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver # 指定了ShardingSphereDriver 為數(shù)據(jù)庫驅(qū)動(dòng)
    url: jdbc:shardingsphere:classpath:sharding-datasource.yml # 指定classpath的sharding-datasource.yml文件

目錄結(jié)構(gòu):

2. sharding-datasource.yml配置

mode:
  type: Standalone       # ShardingSphere 運(yùn)行模式,Standalone 表示單機(jī)模式,不是集群模式
  repository:
    type: MEMORY         # 元數(shù)據(jù)存儲(chǔ)類型,MEMORY 表示元數(shù)據(jù)存儲(chǔ)在內(nèi)存中(也可用 JDBC 存儲(chǔ))
dataSources:
  master:                # master名字可以自定義 數(shù)據(jù)庫主庫(普通表 寫庫)
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource  # 使用 Druid 作為真實(shí)數(shù)據(jù)源
    driverClassName: com.mysql.cj.jdbc.Driver                   # MySQL 驅(qū)動(dòng)
    url: jdbc:mysql://localhost:3306/tsuki-chat?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
    username: root
    password: 123456
  slave:                 #slave名字可以自定義 數(shù)據(jù)庫從庫(普通表 從庫)
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3307/tsuki-chat?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
    username: root
    password: 123456
  users_master:          # users表數(shù)據(jù)庫主庫(用于 users 表分庫分表寫入操作)
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tsuki-users?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
    username: root
    password: 123456

  users_slave:          # users表數(shù)據(jù)庫從庫(用于 users 表分庫分表讀取操作)
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3307/tsuki-users?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
    username: root
    password: 123456

rules:
  # 1?? 全局表(除了 users 表)讀寫分離規(guī)則
  - !READWRITE_SPLITTING
    dataSourceGroups: # 必須用dataSourceGroups,用官網(wǎng)的dataSources會(huì)報(bào)錯(cuò)
      readwrite_ds:                     # 邏輯數(shù)據(jù)源名(可自定義)
        writeDataSourceName: master     # 寫庫
        readDataSourceNames:            # 讀庫集合
          - slave
        transactionalReadQueryStrategy: PRIMARY  # 事務(wù)讀策略,PRIMARY 表示事務(wù)中讀主庫
        loadBalancerName: random        # 讀庫負(fù)載均衡策略
    loadBalancers:
      random:                           # 負(fù)載均衡算法配置
        type: RANDOM                    # 隨機(jī)選擇讀庫

  # 2?? 針對(duì)users 表讀寫分離規(guī)則
  - !READWRITE_SPLITTING
    dataSourceGroups:
      users_group:                      # users 表邏輯數(shù)據(jù)源名(可自定義)
        writeDataSourceName: users_master  # 寫庫
        readDataSourceNames:
          - users_slave # 讀庫
        transactionalReadQueryStrategy: PRIMARY  # 事務(wù)讀策略,PRIMARY 表示事務(wù)中讀主庫
        loadBalancerName: random        # 讀庫負(fù)載均衡策略
    loadBalancers:
      random:
        type: RANDOM                    # 隨機(jī)負(fù)載均衡

  # 3?? users 表分表規(guī)則
  - !SHARDING
    tables:
      users:
        actualDataNodes: users_group.users_${0..1}   # 物理表名列表,users_0 和 users_1
        tableStrategy:
          standard:
            shardingColumn: id                 # 分表字段
            shardingAlgorithmName: user_algo   # 使用分片算法 user_algo
    shardingAlgorithms:
      user_algo:
        type: INLINE
        props:
          algorithm-expression: users_${id % 2}  # 簡單取模算法,將 id % 2 決定插入到 users_0 或 users_1

  # 4?? 其他非分片表(比如 Test、Message 等)走默認(rèn)讀寫分離數(shù)據(jù)源
  - !SINGLE
    tables:
      - "*.*"                             # 匹配所有其他表
    defaultDataSource: readwrite_ds       # 使用邏輯數(shù)據(jù)源 readwrite_ds(即 tsuki-chat 的讀寫分離)

props:
  sql-show: true                         # 打印 SQL,便于調(diào)試
  check-table: false                      # 不檢查表是否存在,防止啟動(dòng)報(bào)錯(cuò)
  default-data-source-name: readwrite_ds  # 默認(rèn)邏輯數(shù)據(jù)源

3. 配置要點(diǎn)

  • 讀寫分離

    • 默認(rèn)庫 (tsuki-chat) → 主從 master/slave。
    • users 專庫 (tsuki-users) → 主從 users_master/users_slave
  • 分表users 表按照 id % 2 分為 users_0users_1。

  • 普通表:通過 !SINGLE 指定默認(rèn)走 readwrite_ds,避免 TableNotFoundException。

  • 元數(shù)據(jù)模式repository: MEMORY → 元數(shù)據(jù)存放在內(nèi)存中,開發(fā)環(huán)境方便測(cè)試。

4. 數(shù)據(jù)庫

數(shù)據(jù)庫首先必須配置主從同步,最好從庫禁用插入(這里教程很多,網(wǎng)上自己搭建)
首先有2個(gè)數(shù)據(jù)源,一共4個(gè)庫
tsuki-chat是我的普通表庫,用于存放不用分庫分表的庫
tsuki-users是我的分庫分表庫,用于users表分表

users分庫分表(我有兩張表)

4. 常見問題

  1. 報(bào)錯(cuò) TableNotFoundException → 沒有配置 !SINGLE,需要為非分片表指定默認(rèn)數(shù)據(jù)源。
  2. 事務(wù)中讀操作跑到從庫 → 配置 transactionalReadQueryStrategy: PRIMARY,保證事務(wù)一致性。
  3. 測(cè)試數(shù)據(jù)回滾導(dǎo)致表為空 → 注意是否加了 @Transactional 測(cè)試注解。

5. 測(cè)試

1. 測(cè)試普通表插入

    @Test
    public void test3() {
        DbTest dbTest = new DbTest(1);
        testMapper.insert(dbTest);
    }

輸出

2025-09-03T14:34:04.361+08:00  INFO 48308 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO db_test  ( id )  VALUES (  ?  )
2025-09-03T14:34:04.362+08:00  INFO 48308 --- [           main] ShardingSphere-SQL                       : Actual SQL: master ::: INSERT INTO db_test  ( id )  VALUES (  ?  ) ::: [114514]
2025-09-03T14:34:04.436+08:00  INFO 48308 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closing ...
2025-09-03T14:34:04.440+08:00  INFO 48308 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closed

我們可以看到輸出了Actual SQL: master ::: INSERT INTO db_test ( id ) VALUES ( ? ) ::: [114514],說明寫入走了master
同時(shí)從庫也有了數(shù)據(jù)

2. 測(cè)試普通表查詢

    @Test
    public void test4() {
        DbTest dbTest = testMapper.selectById(114514);
        log.info(dbTest.toString());
    }

輸出

2025-09-03T14:39:28.865+08:00  INFO 37376 --- [           main] ShardingSphere-SQL                       : Logic SQL: SELECT id FROM db_test WHERE id=?
2025-09-03T14:39:28.865+08:00  INFO 37376 --- [           main] ShardingSphere-SQL                       : Actual SQL: slave ::: SELECT id FROM db_test WHERE id=? ::: [114514]
2025-09-03T14:39:28.914+08:00  INFO 37376 --- [           main] c.t.c.server.TestChatServerApplication   : DbTest(id=114514)

我們可以看到輸出了Actual SQL: slave ::: SELECT id FROM db_test WHERE id=? ::: [114514],說明讀取入走了slave
同時(shí)從庫也有了數(shù)據(jù)。
普通表讀寫測(cè)試分離成功

3. 測(cè)試users表插入

    @Test
    public void test() {
        List<User> users = generateUsers(10); // 生成10條users數(shù)據(jù)
        List<BatchResult> insert = userMapper.insert(users);
        log.info("插入成功");
    }

輸出

2025-09-03T15:00:10.253+08:00  INFO 47088 --- [           main] ShardingSphere-SQL                       : Actual SQL: users_master ::: INSERT INTO users_1  ( id, username, nickname, signature, email, password, avatar, mobile, login_date, logout_date, login_ip, join_type, sex, status, creator, create_time, updater, update_time, deleted )  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ::: [1756882805969, userUbKYU, nickVpxsL, 簽名AWTLp, userUbKYU@example.com, rjctPdFh, https://example.com/avatar/vYJQ.png, 15172505127, 2025-09-02T15:00:05.960025800, 2025-08-31T15:00:05.960025800, 192.168.215.80, 1, 1, 1, system, 2025-08-21T15:00:05.960025800, system, 2025-09-03T15:00:05.960025800, false]
2025-09-03T15:00:10.356+08:00  INFO 47088 --- [           main] c.t.c.server.TestChatServerApplication   : 插入成功

我們可以看到輸出了Actual SQL: users_master ::: INSERT INTO users_1 ,說明寫入走了users_master
同時(shí)從庫也有了數(shù)據(jù)

4. 測(cè)試users表查詢

    @Test
    public void test2() {
        Page<User> userPage = new Page<User>(1, 8);
        Page<User> selectedPage = userMapper.selectPage(userPage, null);
        selectedPage.getRecords().forEach(user -> log.info(String.valueOf(user.getId())));
    }

輸出

2025-09-03T15:07:54.450+08:00  INFO 25284 --- [           main] ShardingSphere-SQL                       : Actual SQL: users_slave ::: SELECT  id,username,nickname,signature,email,password,avatar,mobile,login_date,logout_date,login_ip,join_type,sex,status,creator,create_time,updater,update_time,deleted  FROM users_1 LIMIT ? ::: [8]
2025-09-03T15:07:54.483+08:00  INFO 25284 --- [           main] c.t.c.server.TestChatServerApplication   : 1756882805958
2025-09-03T15:07:54.484+08:00  INFO 25284 --- [           main] c.t.c.server.TestChatServerApplication   : 1756882805960
2025-09-03T15:07:54.484+08:00  INFO 25284 --- [           main] c.t.c.server.TestChatServerApplication   : 1756882805962
2025-09-03T15:07:54.484+08:00  INFO 25284 --- [           main] c.t.c.server.TestChatServerApplication   : 1756882805964
2025-09-03T15:07:54.484+08:00  INFO 25284 --- [           main] c.t.c.server.TestChatServerApplication   : 1756882805966
2025-09-03T15:07:54.484+08:00  INFO 25284 --- [           main] c.t.c.server.TestChatServerApplication   : 1756882805961
2025-09-03T15:07:54.484+08:00  INFO 25284 --- [           main] c.t.c.server.TestChatServerApplication   : 1756882805963
2025-09-03T15:07:54.484+08:00  INFO 25284 --- [           main] c.t.c.server.TestChatServerApplication   : 1756882805965

我們可以看到輸出了Actual SQL: users_slave ::: SELECT ,說明讀取走了users_slave

? 這樣配置后:

  • users 表支持 分庫 + 分表 + 讀寫分離
  • test、orders 等普通表支持 全局讀寫分離
  • SQL 路由清晰可控,適合生產(chǎn)環(huán)境逐步擴(kuò)展。

到此這篇關(guān)于Spring Boot 3整合ShardingSphere-Jdbc分庫分表實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Spring Boot 3 ShardingSphere-Jdbc分庫分表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA通過HttpURLConnection 上傳和下載文件的方法

    JAVA通過HttpURLConnection 上傳和下載文件的方法

    這篇文章主要介紹了JAVA通過HttpURLConnection 上傳和下載文件的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-09-09
  • Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法

    Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法

    這篇文章主要介紹了Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法,主要用到了IOException類,需要的朋友可以參考下
    2016-03-03
  • idea集成shell運(yùn)行環(huán)境以及shell輸出中文亂碼的解決

    idea集成shell運(yùn)行環(huán)境以及shell輸出中文亂碼的解決

    這篇文章主要介紹了idea集成shell運(yùn)行環(huán)境以及shell輸出中文亂碼的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java的非對(duì)稱加密(RSA、數(shù)字簽名、數(shù)字證書)詳解

    Java的非對(duì)稱加密(RSA、數(shù)字簽名、數(shù)字證書)詳解

    這篇文章主要介紹了Java的非對(duì)稱加密(RSA、數(shù)字簽名、數(shù)字證書)詳解,非對(duì)稱加密:加密、解密使用不同的兩把密鑰,這兩把密鑰成對(duì),一般通信開始時(shí)通過非對(duì)稱加密將對(duì)稱加密的密鑰發(fā)送給另一方,然后雙方通過對(duì)稱加密來進(jìn)行溝通,需要的朋友可以參考下
    2024-01-01
  • 過濾器 和 攔截器的 6個(gè)區(qū)別(別再傻傻分不清了)

    過濾器 和 攔截器的 6個(gè)區(qū)別(別再傻傻分不清了)

    這篇文章主要介紹了過濾器 和 攔截器的 6個(gè)區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟

    RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟

    這篇文章主要介紹了RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Spring Cloud LoadBalancer 負(fù)載均衡詳解

    Spring Cloud LoadBalancer 負(fù)載均衡詳解

    本文介紹了如何在Spring Cloud中使用SpringCloudLoadBalancer實(shí)現(xiàn)客戶端負(fù)載均衡,并詳細(xì)講解了輪詢策略和隨機(jī)策略的配置方法,此外,還提供了部署到云服務(wù)器并在多個(gè)實(shí)例之間進(jìn)行負(fù)載均衡的步驟,感興趣的朋友一起看看吧
    2025-02-02
  • maven <repositories>標(biāo)簽和<pluginRepositories>標(biāo)簽的使用

    maven <repositories>標(biāo)簽和<pluginRepositories>標(biāo)簽的使用

    這篇文章主要介紹了maven <repositories>標(biāo)簽和<pluginRepositories>標(biāo)簽的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 深入解析java中的值傳遞和引用傳遞

    深入解析java中的值傳遞和引用傳遞

    這篇文章主要介紹了深入解析java中的值傳遞和引用傳遞,值傳遞是將變量的值復(fù)制給另一個(gè)變量,兩個(gè)變量之間并沒有直接關(guān)系,引用傳遞是將變量的引用(內(nèi)存地址)傳遞給另一個(gè)變量,兩個(gè)變量之間指向同一個(gè)內(nèi)存地址,修改一個(gè)變量的值也會(huì)影響到另一個(gè)變量
    2023-07-07
  • idea2020最新版配置maven的方法

    idea2020最新版配置maven的方法

    這篇文章主要介紹了idea2020最新版配置maven的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06

最新評(píng)論