SpringBoot?整合?ShardingSphere4.1.1實(shí)現(xiàn)分庫(kù)分表功能
前言
ShardingSphere是一套開源的分布式數(shù)據(jù)庫(kù)中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計(jì)劃中)這3款相互獨(dú)立的產(chǎn)品組成。 他們均提供標(biāo)準(zhǔn)化的數(shù)據(jù)分片、分布式事務(wù)和數(shù)據(jù)庫(kù)治理功能,可適用于如Java同構(gòu)、異構(gòu)語(yǔ)言、容器、云原生等各種多樣化的應(yīng)用場(chǎ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語(yǔ)句日志
#多數(shù)據(jù)源配置
datasource:
names: master,slave1,slave2 #自定義真實(shí)的數(shù)據(jù)源名字,多個(gè)數(shù)據(jù)源逗號(hào)隔開
master: #主數(shù)據(jù)源,master來(lái)自上方真實(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ù)庫(kù)連接池的其它屬性
salve1: #從數(shù)據(jù)源,salve1來(lái)自上方真實(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來(lái)自上方真實(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 #從庫(kù)負(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 #指明了分庫(kù)分表要處理的虛擬表名字
tables:
t_user: #自定義一個(gè)虛擬表名字,后續(xù)sql語(yǔ)句中就使用這個(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無(wú)關(guān)的方式進(jìn)行分片
#指定hint分片算法實(shí)現(xiàn)類
algorithmClassName: cn.demo.strategy.DbHintAlgorithm
none: #不使用分片策略
#分庫(kù)策略, 可選項(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無(wú)關(guān)的方式進(jìn)行分片
1. inline(行表達(dá)式分片策略) - 根據(jù)單一分片鍵進(jìn)行精確分片
對(duì)應(yīng)InlineShardingStrategy。使用Groovy的表達(dá)式,提供對(duì)SQL語(yǔ)句中的=和IN的分片操作支持,只支持單分片鍵。對(duì)于簡(jiǎn)單的分片算法,可以通過(guò)簡(jiǎn)單的配置使用,從而避免繁瑣的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} #分片算法,取模
#分庫(kù)策略配置
database-strategy:
inline:
sharding-column: cid #分片字段
algorithm-expression: db_$->{cid%2+1} #分片算法,取模2. standard(標(biāo)準(zhǔn)分片策略) - 根據(jù)單一分片鍵進(jìn)行精確或者范圍分片
對(duì)應(yīng)StandardShardingStrategy,支持精確和范圍分片,提供對(duì)SQL語(yǔ)句中的=,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
#分庫(kù)策略配置
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í)際表的名字集合, 如果是分庫(kù)策略就是數(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分庫(kù)策略
/**
* 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)行精確或者范圍分片
對(duì)應(yīng)ComplexKeysShardingAlgorithm,用于處理使用多鍵作為分片鍵進(jìn)行分片的場(chǎng)景,包含多個(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
#分庫(kù)策略配置
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
//獲得分片列名和分片值的對(duì)應(yīng)map
Map<String, Collection<Long>> mp1 = shardingValue.getColumnNameAndShardingValuesMap();
//shardingValue.getColumnNameAndRangeValuesMap
//獲得分片列名和分片范圍值的對(duì)應(yīng)map
Map<String, Range<Long>> mp2 = shardingValue.getColumnNameAndRangeValuesMap();
return availableTargetNames;
}
}對(duì)于兩個(gè)分片鍵的場(chǎng)景,可以采用基因法
在電商場(chǎng)景中,使用訂單 ID 和買家 ID 查詢數(shù)據(jù)的問(wèn)題。在這個(gè)場(chǎng)景中,我們選擇使用訂單 ID 作為分片鍵是一個(gè)沒(méi)有異議的選擇。那么此時(shí),我們通過(guò) APP 來(lái)查詢自己的訂單時(shí),查詢條件變?yōu)榱朔制I之外的買家 ID,默認(rèn)情況下,查詢語(yǔ)句中不帶有分片鍵會(huì)導(dǎo)致全路由情況。面對(duì)這樣的情況,應(yīng)如何設(shè)計(jì)一個(gè)高效的分片策略?
大廠常常使用的方案是基因法,即將買家 ID 融入到訂單 ID 中,作為訂單 ID 后綴。這樣,指定買家的所有訂單就會(huì)與其訂單在同一分片內(nèi)了,如下圖所示

4. hint策略 - 使用與sql無(wú)關(guān)的方式進(jìn)行分片
對(duì)應(yīng)HintShardingStrategy。通過(guò)Hint指定分片值而非從SQL中提取分片值的方式進(jìn)行分片的策略
hint分片算法接口: HintShardingAlgorithm
#hint 片鍵策略
#分表策略配置
table-strategy:
hint:
algorithm-class-name: cn.demo.strategy.TableHintAlgorithm
#分庫(kù)策略配置
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,來(lái)自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)制路由??梢酝ㄟ^(guò)編程的方式向HintManager中添加分片值,該分片值僅在當(dāng)前線程內(nèi)生效。 Hint方式主要使用場(chǎng)景:
1.分片字段不存在SQL中、數(shù)據(jù)庫(kù)表結(jié)構(gòu)中,而存在于外部業(yè)務(wù)邏輯。
2.強(qiáng)制在主庫(kù)進(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來(lái)添加數(shù)據(jù)源分片鍵值。
- 使用hintManager.addTableShardingValue來(lái)添加表分片鍵值。
分庫(kù)不分表情況下,強(qiáng)制路由至某一個(gè)分庫(kù)時(shí),可使用hintManager.setDatabaseShardingValue方式添加分片。通過(guò)此方式添加分片鍵值后,將跳過(guò)SQL解析和改寫階段,從而提高整體執(zhí)行效率。
清除分片鍵值
分片鍵值保存在ThreadLocal中,所以需要在操作結(jié)束時(shí)調(diào)用hintManager.close()來(lái)清除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分庫(kù)分表 --> <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. 分表的建表語(yǔ)句
在course數(shù)據(jù)庫(kù)下創(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分庫(kù)分表的配置
分表yaml配置
#配置分庫(kù)分表策略
#配置數(shù)據(jù)源
spring:
shardingsphere:
props:
sql:
show: true #顯示sql語(yǔ)句日志
datasource:
names: m1 #指定一個(gè)虛擬數(shù)據(jù)庫(kù)名稱
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ù)庫(kù).表名
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} #分表算法,求模取余算法分庫(kù)yaml配置
#配置分庫(kù)分表策略
#配置多個(gè)數(shù)據(jù)源
spring:
shardingsphere:
datasource:
names: m1,m2 #指定多個(gè)虛擬數(shù)據(jù)庫(kù)名稱
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
#分庫(kù)分表配置
sharding:
tables:
course: #指定一個(gè)虛擬表名稱
actual-data-nodes: m$->{1..2}.course_$->{1..2} #m1.course 數(shù)據(jù)庫(kù).表名
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: #分庫(kù)策略
inline: #inline策略
sharding-column: user_id #分庫(kù)字段
algorithm-expression: m$->{user_id % 2 + 1} #分庫(kù)算法,求模取余算法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. 插入測(cè)試數(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)站文檔
使用手冊(cè) :: ShardingSphere
到此這篇關(guān)于SpringBoot 整合 ShardingSphere4.1.1實(shí)現(xiàn)分庫(kù)分表的文章就介紹到這了,更多相關(guān)SpringBoot ShardingSphere分庫(kù)分表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用for循環(huán)解決經(jīng)典的雞兔同籠問(wèn)題示例
這篇文章主要介紹了Java使用for循環(huán)解決經(jīng)典的雞兔同籠問(wèn)題,結(jié)合實(shí)例形式分析了Java巧妙使用流程控制語(yǔ)句for循環(huán)解決雞兔同籠問(wèn)題相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
Java反射機(jī)制如何解決數(shù)據(jù)傳值為空的問(wèn)題
這篇文章主要介紹了Java反射機(jī)制如何解決數(shù)據(jù)傳值為空的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
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示例,只需創(chuàng)建實(shí)體類和mapper接口,就可以實(shí)現(xiàn)單表的增刪改查操作,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
java返回前端實(shí)體類json數(shù)據(jù)時(shí)忽略某個(gè)屬性方法
這篇文章主要給大家介紹了關(guān)于java返回前端實(shí)體類json數(shù)據(jù)時(shí)忽略某個(gè)屬性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例
本文主要介紹了springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

