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

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

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

網(wǎng)上找了很多資料,包括官網(wǎng),使用springboot3shardingsphere-jdbc都無法運行,查了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ū)動 -->
    <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 配置

新版配置分為了兩個文件,一個application.yml,另一個是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ū)動
    url: jdbc:shardingsphere:classpath:sharding-datasource.yml # 指定classpath的sharding-datasource.yml文件

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

2. sharding-datasource.yml配置

mode:
  type: Standalone       # ShardingSphere 運行模式,Standalone 表示單機模式,不是集群模式
  repository:
    type: MEMORY         # 元數(shù)據(jù)存儲類型,MEMORY 表示元數(shù)據(jù)存儲在內(nèi)存中(也可用 JDBC 存儲)
dataSources:
  master:                # master名字可以自定義 數(shù)據(jù)庫主庫(普通表 寫庫)
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource  # 使用 Druid 作為真實數(shù)據(jù)源
    driverClassName: com.mysql.cj.jdbc.Driver                   # MySQL 驅(qū)動
    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會報錯
      readwrite_ds:                     # 邏輯數(shù)據(jù)源名(可自定義)
        writeDataSourceName: master     # 寫庫
        readDataSourceNames:            # 讀庫集合
          - slave
        transactionalReadQueryStrategy: PRIMARY  # 事務(wù)讀策略,PRIMARY 表示事務(wù)中讀主庫
        loadBalancerName: random        # 讀庫負載均衡策略
    loadBalancers:
      random:                           # 負載均衡算法配置
        type: RANDOM                    # 隨機選擇讀庫

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

  # 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 等)走默認讀寫分離數(shù)據(jù)源
  - !SINGLE
    tables:
      - "*.*"                             # 匹配所有其他表
    defaultDataSource: readwrite_ds       # 使用邏輯數(shù)據(jù)源 readwrite_ds(即 tsuki-chat 的讀寫分離)

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

3. 配置要點

  • 讀寫分離

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

  • 普通表:通過 !SINGLE 指定默認走 readwrite_ds,避免 TableNotFoundException

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

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

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

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

4. 常見問題

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

5. 測試

1. 測試普通表插入

    @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ù)據(jù)

2. 測試普通表查詢

    @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ù)據(jù)。
普通表讀寫測試分離成功

3. 測試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ù)據(jù)

4. 測試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)境逐步擴展。

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

相關(guān)文章

  • Java中notify是順序喚醒還是隨機喚醒的

    Java中notify是順序喚醒還是隨機喚醒的

    這篇文章主要介紹了Java中notify是順序喚醒還是隨機喚醒的,有很多人會認為?notify?是隨機喚醒的,但它真的是隨機喚醒的嗎?帶著疑問一起進入文章了解具體的內(nèi)容吧
    2022-05-05
  • mybatis Example Criteria like 模糊查詢問題

    mybatis Example Criteria like 模糊查詢問題

    這篇文章主要介紹了mybatis Example Criteria like 模糊查詢問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 阿里、華為、騰訊Java技術(shù)面試題精選

    阿里、華為、騰訊Java技術(shù)面試題精選

    這篇文章主要為大家分享了阿里、華為、騰訊Java技術(shù)面試題精選,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • springboot-啟動bean沖突的解決

    springboot-啟動bean沖突的解決

    這篇文章主要介紹了springboot-啟動bean沖突的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java如何根據(jù)不同系統(tǒng)動態(tài)獲取換行符和盤分割符

    Java如何根據(jù)不同系統(tǒng)動態(tài)獲取換行符和盤分割符

    這篇文章主要介紹了Java如何根據(jù)不同系統(tǒng)動態(tài)獲取換行符和盤分割符,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java多線程并發(fā)編程 Synchronized關(guān)鍵字

    Java多線程并發(fā)編程 Synchronized關(guān)鍵字

    現(xiàn)有一成員變量 Test,當線程 A 調(diào)用 Test 的 synchronized 方法,線程 A 獲得 Test 的同步鎖,同時,線程 B 也去調(diào)用 Test 的 synchronized 方法,此時線程 B 無法獲得 Test 的同步鎖,必須等待線程 A 釋放 Test 的同步鎖才能獲得從而執(zhí)行對應(yīng)方法的代碼
    2017-05-05
  • SpringBoot如何優(yōu)雅的處理重復(fù)請求

    SpringBoot如何優(yōu)雅的處理重復(fù)請求

    對于一些用戶請求,在某些情況下是可能重復(fù)發(fā)送的,如果是查詢類操作并無大礙,但其中有些是涉及寫入操作的,一旦重復(fù)了,可能會導(dǎo)致很嚴重的后果,所以本文給大家介紹了SpringBoot優(yōu)雅的處理重復(fù)請求的方法,需要的朋友可以參考下
    2023-12-12
  • java String.split 無法使用小數(shù)點分割的問題

    java String.split 無法使用小數(shù)點分割的問題

    這篇文章主要介紹了java String.split 無法使用小數(shù)點分割的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java實現(xiàn)多項式乘法代碼實例

    Java實現(xiàn)多項式乘法代碼實例

    今天小編就為大家分享一篇關(guān)于Java實現(xiàn)多項式乘法代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Java Collection和Collections的區(qū)別

    Java Collection和Collections的區(qū)別

    本文主要介紹了Java Collection和Collections的區(qū)別,Collection?是表示集合的接口,而?Collections?是對集合進行操作的工具類,下面就來介紹一下具體用法,感興趣的可以了解一下
    2023-12-12

最新評論

孝义市| 利辛县| 卫辉市| 江安县| 定边县| 莆田市| 运城市| 福鼎市| 宜昌市| 虎林市| 日照市| 都兰县| 永泰县| 灵璧县| 嘉兴市| 镇远县| 游戏| 高唐县| 客服| 台北市| 石河子市| 名山县| 揭西县| 连山| 上饶市| 弋阳县| 邢台县| 西充县| 清水河县| 荣成市| 岚皋县| 丹江口市| 卫辉市| 怀仁县| 米易县| 印江| 金塔县| 景谷| 汨罗市| 彰化市| 蒙阴县|