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

SpringBoot?整合?ShardingSphere4.1.1實現(xiàn)分庫分表功能

 更新時間:2023年12月11日 11:17:59   作者:F0urtEEn  
ShardingSphere是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計劃中)這3款相互獨立的產(chǎn)品組成,本文給大家介紹SpringBoot?整合?ShardingSphere4.1.1實現(xiàn)分庫分表,感興趣的朋友一起看看吧

前言

    ShardingSphere是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計劃中)這3款相互獨立的產(chǎn)品組成。 他們均提供標準化的數(shù)據(jù)分片、分布式事務和數(shù)據(jù)庫治理功能,可適用于如Java同構(gòu)、異構(gòu)語言、容器、云原生等各種多樣化的應用場景。

一、ShardingSphere4.1.1的spring boot配置

引入Maven依賴

<!-- for spring boot -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>

Spring boot的yaml規(guī)則配置

spring:
  shardingsphere:
    enabled: true                    #是否開啟sharding
    props:
      sql:
        show: true                  #是否顯示sql語句日志
    #多數(shù)據(jù)源配置
    datasource:
      names: master,slave1,slave2      #自定義真實的數(shù)據(jù)源名字,多個數(shù)據(jù)源逗號隔開
      master:                          #主數(shù)據(jù)源,master來自上方真實數(shù)據(jù)源取的名字
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/master
        username: demo
        password: 123456
        #xxx:xx                       #數(shù)據(jù)庫連接池的其它屬性
      salve1:                         #從數(shù)據(jù)源,salve1來自上方真實數(shù)據(jù)源取的名字
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/salve1
        username: demo
        password: 123456
      salve2:                         #從數(shù)據(jù)源,salve2來自上方真實數(shù)據(jù)源取的名字
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/salve1
        username: demo
        password: 123456
    #主從節(jié)點,讀寫分離配置 (在不使用數(shù)據(jù)分片功能,只需要讀寫分離功能情況下的配置)
    masterslave:
      name: ms                              #自定義一個虛擬數(shù)據(jù)源名字,用于自動路由下方主從數(shù)據(jù)源
      master-data-source-name: master       # 指定主數(shù)據(jù)源
      slave-data-source-names:              # 指定從數(shù)據(jù)源
        - slave1
        - slave2
      load-balance-algorithm-type: round_robin      #從庫負載均衡算法類型,可選值:ROUND_ROBIN,RANDOM
    #數(shù)據(jù)分片 + 讀寫分離
    sharding:
      master-slave-rules:                 #在使用數(shù)據(jù)分片功能情況下,配置讀寫分離功能
        ds0:                              #自定義一個虛擬數(shù)據(jù)源名字,用于自動路由下方主從數(shù)據(jù)源
          masterDataSourceName: master    # 指定主數(shù)據(jù)源
          slaveDataSourceNames:          # 指定從數(shù)據(jù)源
            - slave1
            - slave2
          loadBalanceAlgorithmType: round_robin
      binding-tables:
        - t_user                            #指明了分庫分表要處理的虛擬表名字
      tables:
        t_user:                             #自定義一個虛擬表名字,后續(xù)sql語句中就使用這個表名字,會自動路由到真實的表名
          actualDataNodes: master$->{1..2}.t_user$->{1..10}     #指定真實的數(shù)據(jù)源.表名,這里表示兩個master數(shù)據(jù)源,10張表t_user
          keyGenerator:                   #主鍵自動生成策略
            column: uid                   #指定表字段名
            type: SNOWFLAKE               #指定雪花算法
            props:
              worker:                     #指定雪花算法的工作中心
                id: 1
          #分表策略, 可選項有 inline, standard, complex, hint, none
          tableStrategy:
            inline:                           #inline(行表達式分片策略)- 根據(jù)單一分片鍵進行精確分片
              shardingColumn: uid                           #指定分片鍵(表字段)
              algorithmExpression: t_user$->{uid%2+1}       #指定分片算法,這里是取模算法
            standard:                        #standard(標準分片策略) - 根據(jù)單一分片鍵進行精確或者范圍分片
              shardingColumn: uid
              #指定精確分片算法的實現(xiàn)類, 必選項
              preciseAlgorithmClassName: cn.demo.strategy.TablePreciseAlgorithm
              #指定范圍分片算法的實現(xiàn)類
              rangeAlgorithmClassName: cn.demo.strategy.TableRangeAlgorithm
            complex:                         #complex(復合分片策略) - 根據(jù)多個分片鍵進行精確或者范圍分片
              shardingColumn: uid
              #指定復合分片算法實現(xiàn)類
              algorithmClassName: cn.demo.strategy.TableComplexAlgorithm
            hint:                            #hint策略 - 使用與sql無關的方式進行分片
              #指定hint分片算法實現(xiàn)類
              algorithmClassName: cn.demo.strategy.DbHintAlgorithm
            none:                            #不使用分片策略
          #分庫策略, 可選項有 inline, standard, complex, hint, none
          databaseStrategy:
            inline:              #配置跟上方表策略相同
            standard:
            hint:
            none:

二、ShardingSphere的分片策略

  • inline(行表達式分片策略) - 根據(jù)單一分片鍵進行精確分片
  • standard(標準分片策略) - 根據(jù)單一分片鍵進行精確或者范圍分片
  • complex(復合分片策略) - 根據(jù)多個分片鍵進行精確或者范圍分片
  • hint策略 - 使用與sql無關的方式進行分片

1. inline(行表達式分片策略) - 根據(jù)單一分片鍵進行精確分片

對應InlineShardingStrategy。使用Groovy的表達式,提供對SQL語句中的=和IN的分片操作支持,只支持單分片鍵。對于簡單的分片算法,可以通過簡單的配置使用,從而避免繁瑣的Java代碼開發(fā),如: user_$->{u_id % 8} 表示t_user表根據(jù)u_id模8,而分成8張表,表名稱為user_0到user_7。

#inline 單分片鍵策略, sql不支持 >, <, between and 
#分表策略配置
table-strategy:
  inline:
    sharding-column: cid   #分片字段
    algorithm-expression: course_$->{cid%2+1}    #分片算法,取模
#分庫策略配置
database-strategy:
  inline:
    sharding-column: cid   #分片字段
    algorithm-expression: db_$->{cid%2+1}    #分片算法,取模

2. standard(標準分片策略) - 根據(jù)單一分片鍵進行精確或者范圍分片

對應StandardShardingStrategy,支持精確和范圍分片,提供對SQL語句中的=,IN,BETWEEN AND、>、<、>=、<=的分片操作支持。

精確分片算法接口: PreciseShardingAlgorithm, 必選的,用于處理=和IN的分片

范圍分片算法接口: RangeShardingAlgorithm,用于處理BETWEEN AND, >, <, >=, <=分片

#standard 單分片鍵策略, 支持精確和范圍分片
#分表策略配置
table-strategy:
   standard:
     sharding-column: cid   #分片字段
     #指定精確分片算法的實現(xiàn)類, 必選項
     precise-algorithm-class-name: cn.demo.strategy.TablePreciseAlgorithm
     #指定范圍分片算法的實現(xiàn)類
     range-algorithm-class-name: cn.demo.strategy.TableRangeAlgorithm
#分庫策略配置
database-strategy:
  standard:
    sharding-column: cid
    precise-algorithm-class-name: cn.demo.strategy.DbPreciseAlgorithm
    range-algorithm-class-name: cn.demo.strategy.DbRangeAlgorithm

自定義類實現(xiàn)精確或范圍分片算法

注意:集合參數(shù)Collection<String> availableTargetNames 表示數(shù)據(jù)源或者實際表的名字集合,

如果是分表策略就是實際表的名字集合, 如果是分庫策略就是數(shù)據(jù)源名字集合

table分表策略

/**
 * standard分片策略的表精確分片算法實現(xiàn)類
 * 實現(xiàn)接口 PreciseShardingAlgorithm<T>, 泛型類T是分片鍵的字段類型
 */
public class TablePreciseAlgorithm implements PreciseShardingAlgorithm<Long> {
    /**
     *  精確分片算法:用于處理=和IN的分片
     * @param availableTargetNames - 數(shù)據(jù)源或者實際表的名字集合
     * @param preciseShardingValue - 包含邏輯表名、分片列和分片列的值
     * @return 返回分片后的實際表名
     */
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> preciseShardingValue) {
        //獲取分片列的值
        Long value = preciseShardingValue.getValue();
        //獲得虛擬表名
        String logicTableName = preciseShardingValue.getLogicTableName();
        //實現(xiàn)course_$->{cid%2+1} 取模分片算法
        long index = value % 2 + 1;
        //拼接獲得實際表名
        String actualTableName = logicTableName + "_" + index;
        //判斷配置的實際表集合中是否有該實際表名
        if(availableTargetNames.contains(actualTableName)) {
            return actualTableName;
        }
        return null;
    }
}
/**
 * standard分片策略的范圍分片算法實現(xiàn)類
 * 實現(xiàn)接口 PreciseShardingAlgorithm<T>, 泛型類T是分片鍵的字段類型
 */
public class TableRangeAlgorithm implements RangeShardingAlgorithm<Long> {
    /**
     *  范圍分片算法:用于處理BETWEEN AND, >, <, >=, <=分片
     * @param availableTargetNames - 數(shù)據(jù)源或者實際表的名字集合
     * @param shardingValue - 分片值
     * @return 返回分片后的實際表名
     */
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Long> shardingValue) {
        //實現(xiàn)范圍查詢 cid between 200 and 300 中的上限和下限值
        Range<Long> valueRange = shardingValue.getValueRange();
        Long lower = valueRange.lowerEndpoint();   //下限值200
        Long upper = valueRange.upperEndpoint();   //上限值200
        //下面自行實現(xiàn)邏輯判斷分片后的實際表名,這里就不具體實現(xiàn)了
        return availableTargetNames;
    }
}

 DB分庫策略

/**
 * standard分片策略的表精確分片算法實現(xiàn)類
 * 實現(xiàn)接口 PreciseShardingAlgorithm<T>, 泛型類T是分片鍵的字段類型
 */
public class DbPreciseAlgorithm implements PreciseShardingAlgorithm<Long> {
    /**
     *  精確分片算法:用于處理=和IN的分片
     * @param availableTargetNames - 數(shù)據(jù)源或者實際表的名字集合
     * @param preciseShardingValue - 包含邏輯表名、分片列和分片列的值
     * @return 返回數(shù)據(jù)源名字
     */
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> preciseShardingValue) {
        //獲取配置的所有數(shù)據(jù)源名字集合
        System.out.println("===> names: "+availableTargetNames);
        return null;
    }
}

3. complex(復合分片策略) - 根據(jù)多個分片鍵進行精確或者范圍分片

對應ComplexKeysShardingAlgorithm,用于處理使用多鍵作為分片鍵進行分片的場景,包含多個分片鍵的邏輯較復雜,需要應用開發(fā)者自行處理其中的邏輯,需要配合ComplexShardingStrategy使用。

復合分片算法接口: ComplexKeysShardingAlgorithm

#complex 多個分片鍵策略, 支持精確和范圍分片
#分表策略配置
table-strategy:
   complex:
     sharding-column: cid, user_id   #分片字段, 可以指定多個
     algorithm-class-name: cn.demo.strategy.TableComplexAlgorithm
#分庫策略配置
database-strategy:
  complex:
    sharding-column: cid, user_id   #分片字段, 可以指定多個
    algorithm-class-name: cn.demo.strategy.DbComplexAlgorithm
/**
 * complex 多個分片鍵的分片策略
 * 實現(xiàn)接口 PreciseShardingAlgorithm<T>, 泛型類T是分片鍵的字段類型
 */
public class TableComplexAlgorithm implements ComplexKeysShardingAlgorithm<Long> {
    /**
     * complex 多個分片鍵的分片算法
     *
     * @param availableTargetNames - 數(shù)據(jù)源或者實際表的名字集合
     * @param shardingValue - 含邏輯表名、分片列和分片列的值
     * @return 返回實際表名集合
     */
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, ComplexKeysShardingValue<Long> shardingValue) {
        Collection<String> result = new ArrayList<>();
        String logicTableName = shardingValue.getLogicTableName();
        //shardingValue.getColumnNameAndShardingValuesMap
        //獲得分片列名和分片值的對應map
        Map<String, Collection<Long>> mp1 = shardingValue.getColumnNameAndShardingValuesMap();
        //shardingValue.getColumnNameAndRangeValuesMap
        //獲得分片列名和分片范圍值的對應map
        Map<String, Range<Long>> mp2 = shardingValue.getColumnNameAndRangeValuesMap();
        return availableTargetNames;
    }
}

對于兩個分片鍵的場景,可以采用基因法

在電商場景中,使用訂單 ID 和買家 ID 查詢數(shù)據(jù)的問題。在這個場景中,我們選擇使用訂單 ID 作為分片鍵是一個沒有異議的選擇。那么此時,我們通過 APP 來查詢自己的訂單時,查詢條件變?yōu)榱朔制I之外的買家 ID,默認情況下,查詢語句中不帶有分片鍵會導致全路由情況。面對這樣的情況,應如何設計一個高效的分片策略?

大廠常常使用的方案是基因法,即將買家 ID 融入到訂單 ID 中,作為訂單 ID 后綴。這樣,指定買家的所有訂單就會與其訂單在同一分片內(nèi)了,如下圖所示

 4. hint策略 - 使用與sql無關的方式進行分片

對應HintShardingStrategy。通過Hint指定分片值而非從SQL中提取分片值的方式進行分片的策略

hint分片算法接口: HintShardingAlgorithm

#hint 片鍵策略
#分表策略配置
table-strategy:
   hint:
     algorithm-class-name: cn.demo.strategy.TableHintAlgorithm
 
#分庫策略配置
database-strategy:
  hint:
    algorithm-class-name: cn.demo.strategy.DbHintAlgorithm
public class TableHintAlgorithm implements HintShardingAlgorithm<Long> {
    /**
     * Sharding.
     *
     * <p>sharding value injected by hint, not in SQL.</p>
     *
     * @param availableTargetNames available data sources or tables's names
     * @param shardingValue        sharding value,來自hintManager設置的值
     * @return sharding result for data sources or tables's names
     */
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, HintShardingValue<Long> shardingValue) {
        return null;
    }
}

ShardingSphere使用ThreadLocal管理分片鍵值進行Hint強制路由??梢酝ㄟ^編程的方式向HintManager中添加分片值,該分片值僅在當前線程內(nèi)生效。 Hint方式主要使用場景:

1.分片字段不存在SQL中、數(shù)據(jù)庫表結(jié)構(gòu)中,而存在于外部業(yè)務邏輯。

2.強制在主庫進行某些數(shù)據(jù)操作。

Hint分片算法需要用戶實現(xiàn)HintShardingAlgorithm接口,ShardingSphere在進行Routing時,將會從HintManager中獲取分片值進行路由操作。

獲取HintManager

HintManager hintManager = HintManager.getInstance();

添加分片鍵值

  • 使用hintManager.addDatabaseShardingValue來添加數(shù)據(jù)源分片鍵值。
  • 使用hintManager.addTableShardingValue來添加表分片鍵值。

分庫不分表情況下,強制路由至某一個分庫時,可使用hintManager.setDatabaseShardingValue方式添加分片。通過此方式添加分片鍵值后,將跳過SQL解析和改寫階段,從而提高整體執(zhí)行效率。

清除分片鍵值

分片鍵值保存在ThreadLocal中,所以需要在操作結(jié)束時調(diào)用hintManager.close()來清除ThreadLocal中的內(nèi)容。

代碼示例

// Sharding database and table with using hintManager.
        String sql = "SELECT * FROM t_order";
        try (HintManager hintManager = HintManager.getInstance();
             Connection conn = dataSource.getConnection();
             PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
            hintManager.addDatabaseShardingValue("t_order", 1);
            hintManager.addTableShardingValue("t_order", 2);
            try (ResultSet rs = preparedStatement.executeQuery()) {
                while (rs.next()) {
                    // ...
                }
            }
        }
// Sharding database without sharding table and routing to only one database with using hintManger.
        String sql = "SELECT * FROM t_order";
        try (HintManager hintManager = HintManager.getInstance();
             Connection conn = dataSource.getConnection();
             PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
            hintManager.setDatabaseShardingValue(3);
            try (ResultSet rs = preparedStatement.executeQuery()) {
                while (rs.next()) {
                    // ...
                }
            }
        }

三、SpringBoot 整合 ShardingSphere4.1.1

 1. POM文件引入shardingSphere相關依賴

 
<!-- mysql驅(qū)動 -->
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis框架 -->
<dependency>
   <groupId>org.mybatis.spring.boot</groupId>
   <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- druid數(shù)據(jù)源 -->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<!-- sharding-jdbc分庫分表 -->
<dependency>
   <groupId>org.apache.shardingsphere</groupId>
   <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
   <version>4.1.1</version>
</dependency>
<!-- sharding-transaction分布式事務 -->
<dependency>
   <groupId>org.apache.shardingsphere</groupId>
   <artifactId>sharding-transaction-xa-core</artifactId>
   <version>4.1.1</version>
</dependency>

 2. 分表的建表語句

在course數(shù)據(jù)庫下創(chuàng)建兩張表course_1, course_2

-- course.course_1 definition
 
CREATE TABLE `course_1` (
  `cid` bigint(20) NOT NULL COMMENT 'ID',
  `cname` varchar(100) NOT NULL,
  `user_id` varchar(64) NOT NULL,
  `cstatus` tinyint(4) NOT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
 
 
-- course.course_2 definition
 
CREATE TABLE `course_2` (
  `cid` bigint(20) NOT NULL COMMENT 'ID',
  `cname` varchar(100) NOT NULL,
  `user_id` varchar(64) NOT NULL,
  `cstatus` tinyint(4) NOT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

 3. yaml配置文件配置sharding分庫分表的配置

分表yaml配置

#配置分庫分表策略
#配置數(shù)據(jù)源
spring:
  shardingsphere:
    props:
        sql:
          show: true  #顯示sql語句日志
    datasource:
      names: m1       #指定一個虛擬數(shù)據(jù)庫名稱
      m1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/course?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
        username: test
        password: 123456
#分表配置, 這里使用主鍵cid 作為分表字段
    sharding:
      tables:
        course:    #指定一個虛擬表名稱
          actual-data-nodes: m1.course_$->{1..2}     #實際使用的表節(jié)點, 數(shù)據(jù)庫.表名
          key-generator:        #主鍵自動生成策略
            column: cid        
            type: SNOWFLAKE     #使用雪花ID
            props:
              worker:
                id: 1
          table-strategy:       #分表策略
            inline:             #inline策略
              sharding-column: cid      #分表字段
              algorithm-expression: course_$->{cid%2+1}    #分表算法,求模取余算法

分庫yaml配置 

#配置分庫分表策略
#配置多個數(shù)據(jù)源
spring:
  shardingsphere:
    datasource:
      names: m1,m2     #指定多個虛擬數(shù)據(jù)庫名稱
      m1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/course1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
        username: test
        password: 123456
     m2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/course2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
        username: test
        password: 123456
#分庫分表配置
    sharding:
      tables:
        course:    #指定一個虛擬表名稱
          actual-data-nodes: m$->{1..2}.course_$->{1..2}     #m1.course  數(shù)據(jù)庫.表名
          key-generator:        #主鍵自動生成策略
            column: cid        
            type: SNOWFLAKE     #使用雪花ID
            props:
              worker:
                id: 1
          table-strategy:       #分表策略
            inline:             #inline策略
              sharding-column: cid      #分表字段
              algorithm-expression: course_$->{cid%2+1}    #分表算法,求模取余算法
          database-strategy:     #分庫策略
            inline:             #inline策略
              sharding-column: user_id     #分庫字段
              algorithm-expression: m$->{user_id % 2 + 1}    #分庫算法,求模取余算法

4.  啟動類上移除Druid數(shù)據(jù)源的自動配置

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class )
public class ShardingsphereApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShardingsphereApplication.class, args);
    }
}

5. 插入測試數(shù)據(jù)

正常使用mapper接口進行數(shù)據(jù)插入即可

@Service
public class CourseService {
    @Autowired
    private CourseMapper courseMapper;
    @PostConstruct
    private void init() {
        this.insert();
    }
    public void insert() {
        for (int i=1;i<=10;i++) {
            Course c = new Course(null, "湯姆"+i, "tom"+i, 1);
            courseMapper.insert(c);
        }
    }
}

插入結(jié)果:

course_1表

 course_2表

四、ShardingSphere實現(xiàn)分布式事務控制

引入Maven依賴

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>${shardingsphere.version}</version>
</dependency>
<!-- 使用XA事務時,需要引入此模塊 -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-transaction-xa-core</artifactId>
    <version>${shardingsphere.version}</version>
</dependency>
<!-- 使用BASE事務時,需要引入此模塊 -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-transaction-base-seata-at</artifactId>
    <version>${sharding-sphere.version}</version>
</dependency>

 ShardingSphere要實現(xiàn)事務控制需要手動聲明一個PlatformTransactionManager事務管理器Bean,否則事務不會生效。還要將ShardingDataSource 數(shù)據(jù)源注入到事務管理器中。

    /**
     * 事務管理器中注入Sharding數(shù)據(jù)源 ShardingDataSource
     */
    @Bean
    @Primary
    public PlatformTransactionManager platformTransactionManager(ShardingDataSource shardingDataSource) {
        PlatformTransactionManager manager = new DataSourceTransactionManager(shardingDataSource);
        return  manager;
    }

后續(xù)使用注解@EnableTransactionManagement開啟事務,注解@Transactional標注在需要事務控制的方法上。

@Transactional
@ShardingTransactionType(TransactionType.XA)  // 支持TransactionType.LOCAL, TransactionType.XA, TransactionType.BASE
public void insert() {
    jdbcTemplate.execute("INSERT INTO t_order (user_id, status) VALUES (?, ?)", (PreparedStatementCallback<Object>) preparedStatement -> {
        preparedStatement.setObject(1, i);
        preparedStatement.setObject(2, "init");
        preparedStatement.executeUpdate();
    });
}

Sharding支持事務類型TransactionType.LOCAL, TransactionType.XA, TransactionType.BASE 

本文參考shardingsphere官網(wǎng)網(wǎng)站文檔

使用手冊 :: ShardingSphere

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

相關文章

  • 關于idea中出現(xiàn)nbsp和zwsp的完美解決辦法

    關于idea中出現(xiàn)nbsp和zwsp的完美解決辦法

    本文給大家介紹關于idea中出現(xiàn)nbsp和zwsp的解決辦法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-06-06
  • SpringBoot集成ShedLock實現(xiàn)分布式定時任務的示例代碼

    SpringBoot集成ShedLock實現(xiàn)分布式定時任務的示例代碼

    ShedLock 是一個 Java 庫,通常用于分布式系統(tǒng)中,確保定時任務(Scheduled Tasks)在集群環(huán)境下只被某一個實例執(zhí)行一次,本文給大家介紹了SpringBoot集成ShedLock實現(xiàn)分布式定時任務的示例代碼,需要的朋友可以參考下
    2024-12-12
  • Java中常用修飾符的使用方法匯總

    Java中常用修飾符的使用方法匯總

    下面小編就為大家?guī)硪黄狫ava中常用修飾符的使用方法匯總。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • IDEA中用maven連接數(shù)據(jù)庫的教程

    IDEA中用maven連接數(shù)據(jù)庫的教程

    這篇文章主要介紹了IDEA中用maven連接數(shù)據(jù)庫的教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 使用注解@Validated和BindingResult對入?yún)⑦M行非空校驗方式

    使用注解@Validated和BindingResult對入?yún)⑦M行非空校驗方式

    這篇文章主要介紹了使用注解@Validated和BindingResult對入?yún)⑦M行非空校驗方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java實現(xiàn)一個簡單的長輪詢的示例代碼

    Java實現(xiàn)一個簡單的長輪詢的示例代碼

    長輪詢是與服務器保持即時通信的最簡單的方式,它不使用任何特定的協(xié)議,例如 WebSocket ,所以也不依賴于瀏覽器版本等外部條件的兼容性。本文將用Java實現(xiàn)一個簡單的長輪詢,需要的可以參考一下
    2022-08-08
  • Java模版引擎Freemarker

    Java模版引擎Freemarker

    FreeMarker是一個模板引擎,一個基于模板生成文本輸出的通用工具,使用純Java編寫 FreeMarker被設計用來生成HTML Web頁面,特別是基于MVC模式的應用程序
    2016-04-04
  • Java 的 Condition 接口與等待通知機制詳解

    Java 的 Condition 接口與等待通知機制詳解

    在 Java 并發(fā)編程里,實現(xiàn)線程間的協(xié)作與同步是極為關鍵的任務,本文將深入探究Condition接口及其背后的等待通知機制,感興趣的朋友一起看看吧
    2025-05-05
  • spring boot對IP地址設置黑白名單的項目實踐

    spring boot對IP地址設置黑白名單的項目實踐

    本文主要介紹了spring boot對IP地址設置黑白名單的項目實踐,通過YML配置文件定義過濾器類并注冊FilterConfig來實現(xiàn)訪問控制,具有一定的參考價值,感興趣的可以了解一下
    2025-07-07
  • Spring Boot開箱即用可插拔實現(xiàn)過程演練與原理解析

    Spring Boot開箱即用可插拔實現(xiàn)過程演練與原理解析

    本文通過深入探討Spring Boot的背景歷史、業(yè)務場景、功能點以及底層原理,并通過Java代碼手寫模擬了Spring Boot的啟動過程和自動配置功能,為開發(fā)者提供了一個全面的理解,感興趣的朋友跟隨小編一起看看吧
    2024-11-11

最新評論

鹿泉市| 岳西县| 邵武市| 台东县| 石首市| 增城市| 班玛县| 包头市| 右玉县| 青浦区| 抚州市| 巴塘县| 阿拉尔市| 凯里市| 南靖县| 象山县| 莒南县| 郴州市| 宁陵县| 奉新县| 哈尔滨市| 瑞安市| 崇文区| 尉犁县| 青海省| 德江县| 峨眉山市| 四川省| 富民县| 谢通门县| 娱乐| 镇康县| 天长市| 南充市| 青阳县| 盖州市| 延长县| 宁海县| 子洲县| 同江市| 垣曲县|