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

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

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

前言

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

一、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í)的數(shù)據(jù)源名字,多個(gè)數(shù)據(jù)源逗號隔開
      master:                          #主數(shù)據(jù)源,master來自上方真實(shí)數(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í)數(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í)數(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é)點(diǎn),讀寫分離配置 (在不使用數(shù)據(jù)分片功能,只需要讀寫分離功能情況下的配置)
    masterslave:
      name: ms                              #自定義一個(gè)虛擬數(shù)據(jù)源名字,用于自動(dòng)路由下方主從數(shù)據(jù)源
      master-data-source-name: master       # 指定主數(shù)據(jù)源
      slave-data-source-names:              # 指定從數(shù)據(jù)源
        - slave1
        - slave2
      load-balance-algorithm-type: round_robin      #從庫負(fù)載均衡算法類型,可選值:ROUND_ROBIN,RANDOM
    #數(shù)據(jù)分片 + 讀寫分離
    sharding:
      master-slave-rules:                 #在使用數(shù)據(jù)分片功能情況下,配置讀寫分離功能
        ds0:                              #自定義一個(gè)虛擬數(shù)據(jù)源名字,用于自動(dòng)路由下方主從數(shù)據(jù)源
          masterDataSourceName: master    # 指定主數(shù)據(jù)源
          slaveDataSourceNames:          # 指定從數(shù)據(jù)源
            - slave1
            - slave2
          loadBalanceAlgorithmType: round_robin
      binding-tables:
        - t_user                            #指明了分庫分表要處理的虛擬表名字
      tables:
        t_user:                             #自定義一個(gè)虛擬表名字,后續(xù)sql語句中就使用這個(gè)表名字,會(huì)自動(dòng)路由到真實(shí)的表名
          actualDataNodes: master$->{1..2}.t_user$->{1..10}     #指定真實(shí)的數(shù)據(jù)源.表名,這里表示兩個(gè)master數(shù)據(jù)源,10張表t_user
          keyGenerator:                   #主鍵自動(dòng)生成策略
            column: uid                   #指定表字段名
            type: SNOWFLAKE               #指定雪花算法
            props:
              worker:                     #指定雪花算法的工作中心
                id: 1
          #分表策略, 可選項(xiàng)有 inline, standard, complex, hint, none
          tableStrategy:
            inline:                           #inline(行表達(dá)式分片策略)- 根據(jù)單一分片鍵進(jìn)行精確分片
              shardingColumn: uid                           #指定分片鍵(表字段)
              algorithmExpression: t_user$->{uid%2+1}       #指定分片算法,這里是取模算法
            standard:                        #standard(標(biāo)準(zhǔn)分片策略) - 根據(jù)單一分片鍵進(jìn)行精確或者范圍分片
              shardingColumn: uid
              #指定精確分片算法的實(shí)現(xiàn)類, 必選項(xiàng)
              preciseAlgorithmClassName: cn.demo.strategy.TablePreciseAlgorithm
              #指定范圍分片算法的實(shí)現(xiàn)類
              rangeAlgorithmClassName: cn.demo.strategy.TableRangeAlgorithm
            complex:                         #complex(復(fù)合分片策略) - 根據(jù)多個(gè)分片鍵進(jìn)行精確或者范圍分片
              shardingColumn: uid
              #指定復(fù)合分片算法實(shí)現(xiàn)類
              algorithmClassName: cn.demo.strategy.TableComplexAlgorithm
            hint:                            #hint策略 - 使用與sql無關(guān)的方式進(jìn)行分片
              #指定hint分片算法實(shí)現(xiàn)類
              algorithmClassName: cn.demo.strategy.DbHintAlgorithm
            none:                            #不使用分片策略
          #分庫策略, 可選項(xiàng)有 inline, standard, complex, hint, none
          databaseStrategy:
            inline:              #配置跟上方表策略相同
            standard:
            hint:
            none:

二、ShardingSphere的分片策略

  • inline(行表達(dá)式分片策略) - 根據(jù)單一分片鍵進(jìn)行精確分片
  • standard(標(biāo)準(zhǔn)分片策略) - 根據(jù)單一分片鍵進(jìn)行精確或者范圍分片
  • complex(復(fù)合分片策略) - 根據(jù)多個(gè)分片鍵進(jìn)行精確或者范圍分片
  • hint策略 - 使用與sql無關(guān)的方式進(jìn)行分片

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

對應(yīng)InlineShardingStrategy。使用Groovy的表達(dá)式,提供對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(標(biāo)準(zhǔn)分片策略) - 根據(jù)單一分片鍵進(jìn)行精確或者范圍分片

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

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

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

#standard 單分片鍵策略, 支持精確和范圍分片
#分表策略配置
table-strategy:
   standard:
     sharding-column: cid   #分片字段
     #指定精確分片算法的實(shí)現(xiàn)類, 必選項(xiàng)
     precise-algorithm-class-name: cn.demo.strategy.TablePreciseAlgorithm
     #指定范圍分片算法的實(shí)現(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

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

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

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

table分表策略

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

 DB分庫策略

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

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

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

復(fù)合分片算法接口: ComplexKeysShardingAlgorithm

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

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

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

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

 4. hint策略 - 使用與sql無關(guān)的方式進(jìn)行分片

對應(yīng)HintShardingStrategy。通過Hint指定分片值而非從SQL中提取分片值的方式進(jìn)行分片的策略

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設(shè)置的值
     * @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管理分片鍵值進(jìn)行Hint強(qiáng)制路由??梢酝ㄟ^編程的方式向HintManager中添加分片值,該分片值僅在當(dāng)前線程內(nèi)生效。 Hint方式主要使用場景:

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

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

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

獲取HintManager

HintManager hintManager = HintManager.getInstance();

添加分片鍵值

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

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

清除分片鍵值

分片鍵值保存在ThreadLocal中,所以需要在操作結(jié)束時(shí)調(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相關(guān)依賴

 
<!-- mysql驅(qū)動(dòng) -->
<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分布式事務(wù) -->
<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       #指定一個(gè)虛擬數(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:    #指定一個(gè)虛擬表名稱
          actual-data-nodes: m1.course_$->{1..2}     #實(shí)際使用的表節(jié)點(diǎn), 數(shù)據(jù)庫.表名
          key-generator:        #主鍵自動(dòng)生成策略
            column: cid        
            type: SNOWFLAKE     #使用雪花ID
            props:
              worker:
                id: 1
          table-strategy:       #分表策略
            inline:             #inline策略
              sharding-column: cid      #分表字段
              algorithm-expression: course_$->{cid%2+1}    #分表算法,求模取余算法

分庫yaml配置 

#配置分庫分表策略
#配置多個(gè)數(shù)據(jù)源
spring:
  shardingsphere:
    datasource:
      names: m1,m2     #指定多個(gè)虛擬數(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:    #指定一個(gè)虛擬表名稱
          actual-data-nodes: m$->{1..2}.course_$->{1..2}     #m1.course  數(shù)據(jù)庫.表名
          key-generator:        #主鍵自動(dòng)生成策略
            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.  啟動(dòng)類上移除Druid數(shù)據(jù)源的自動(dòng)配置

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

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

正常使用mapper接口進(jìn)行數(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實(shí)現(xiàn)分布式事務(wù)控制

引入Maven依賴

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

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

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

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

@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支持事務(wù)類型TransactionType.LOCAL, TransactionType.XA, TransactionType.BASE 

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

使用手冊 :: ShardingSphere

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

相關(guān)文章

  • Java使用for循環(huán)解決經(jīng)典的雞兔同籠問題示例

    Java使用for循環(huán)解決經(jīng)典的雞兔同籠問題示例

    這篇文章主要介紹了Java使用for循環(huán)解決經(jīng)典的雞兔同籠問題,結(jié)合實(shí)例形式分析了Java巧妙使用流程控制語句for循環(huán)解決雞兔同籠問題相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • Java反射機(jī)制如何解決數(shù)據(jù)傳值為空的問題

    Java反射機(jī)制如何解決數(shù)據(jù)傳值為空的問題

    這篇文章主要介紹了Java反射機(jī)制如何解決數(shù)據(jù)傳值為空的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java括號匹配問題介紹

    java括號匹配問題介紹

    大家好,本篇文章主要講的是java括號匹配問題介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • SpringBoot整合EasyExcel實(shí)現(xiàn)Excel表格導(dǎo)出功能

    SpringBoot整合EasyExcel實(shí)現(xiàn)Excel表格導(dǎo)出功能

    這篇文章主要介紹了SpringBoot整合EasyExcel實(shí)現(xiàn)Excel表格導(dǎo)出功能,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • SpringBoot和MybatisPlus實(shí)現(xiàn)通用Controller示例

    SpringBoot和MybatisPlus實(shí)現(xiàn)通用Controller示例

    本文主要介紹了SpringBoot和MybatisPlus實(shí)現(xiàn)通用Controller示例,只需創(chuàng)建實(shí)體類和mapper接口,就可以實(shí)現(xiàn)單表的增刪改查操作,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Java 詳解異常的處理機(jī)制

    Java 詳解異常的處理機(jī)制

    異常是程序中的一些錯(cuò)誤,但并不是所有的錯(cuò)誤都是異常,并且錯(cuò)誤有時(shí)候是可以避免的。比如你的代碼少一個(gè)分號,那運(yùn)行出來結(jié)果是提示是錯(cuò)誤 java.lang.Error;如果你用System.out.println(11/0),那你是因?yàn)橛?做了除數(shù),會(huì)拋出 java.lang.ArithmeticException 的異常
    2021-11-11
  • java返回前端實(shí)體類json數(shù)據(jù)時(shí)忽略某個(gè)屬性方法

    java返回前端實(shí)體類json數(shù)據(jù)時(shí)忽略某個(gè)屬性方法

    這篇文章主要給大家介紹了關(guān)于java返回前端實(shí)體類json數(shù)據(jù)時(shí)忽略某個(gè)屬性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例

    springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例

    本文主要介紹了springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 一文徹底搞定Java哈希表和哈希沖突

    一文徹底搞定Java哈希表和哈希沖突

    本文介紹了什么是哈希表?什么是哈希函數(shù)?什么是哈希沖突?三個(gè)問題的解決方案,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java多線程之哲學(xué)家就餐問題詳解

    Java多線程之哲學(xué)家就餐問題詳解

    這篇文章主要介紹了Java多線程之哲學(xué)家就餐問題詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評論