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)典的雞兔同籠問題,結(jié)合實(shí)例形式分析了Java巧妙使用流程控制語句for循環(huán)解決雞兔同籠問題相關(guān)操作技巧,需要的朋友可以參考下2018-05-05Java反射機(jī)制如何解決數(shù)據(jù)傳值為空的問題
這篇文章主要介紹了Java反射機(jī)制如何解決數(shù)據(jù)傳值為空的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot整合EasyExcel實(shí)現(xiàn)Excel表格導(dǎo)出功能
這篇文章主要介紹了SpringBoot整合EasyExcel實(shí)現(xiàn)Excel表格導(dǎo)出功能,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07SpringBoot和MybatisPlus實(shí)現(xiàn)通用Controller示例
本文主要介紹了SpringBoot和MybatisPlus實(shí)現(xiàn)通用Controller示例,只需創(chuàng)建實(shí)體類和mapper接口,就可以實(shí)現(xiàn)單表的增刪改查操作,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03java返回前端實(shí)體類json數(shù)據(jù)時(shí)忽略某個(gè)屬性方法
這篇文章主要給大家介紹了關(guān)于java返回前端實(shí)體類json數(shù)據(jù)時(shí)忽略某個(gè)屬性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例
本文主要介紹了springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03