Sharding-JDBC系列--分庫分表
技術標籤:資料庫中介軟體
其他網址
【Sharding-JDBC】(三)整合mybatis-plus 水平分庫、分表_路西法Lucifer-CSDN部落格
SpringBoot+Mybatis-Plus+ShardingSphere分庫分表
2、使用SpringBoot+Sharding-JDBC+MyBatisPlus完成分庫分表 - 林雷部落格
簡介
本文實戰一下Sharding-JDBC分庫分表。依賴:sharding-jdbc-spring-boot-starter4.4.1,mybatis-plus3.4.1。
注意:不要參考官網的文件,官網文件可能沒更新,配置根本無效。
實戰
建庫建表
建庫
建立兩個庫:sharding-jdbc0、sharding-jdbc1
建表
在上邊兩個庫裡按下邊這個結構建立表,以t_order_0和t_order_1命名。
CREATE TABLE `t_order` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `user_id` bigint(11) NULL DEFAULT NULL COMMENT '使用者id', `product_id` bigint(11) NULL DEFAULT NULL COMMENT '產品id', `count` int(11) NULL DEFAULT NULL COMMENT '數量', `money` decimal(11, 0) NULL DEFAULT NULL COMMENT '金額', `status` int(1) NULL DEFAULT NULL COMMENT '訂單狀態:0:建立中;1:已完結', `create_time` datetime(0) NULL DEFAULT NULL, `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0), PRIMARY KEY (`id`) ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
結果
依賴與配置
依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!-- <version>8.0.21</version> 版本Spring-Boot-Parent中已帶 --> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/sharding-jdbc-spring-boot-starter --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.1.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
配置
application.yml
server: port: 9011 spring: application: name: order # datasource: # driver-class-name: com.mysql.cj.jdbc.Driver # url: jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 # username: root # password: 222333 profiles: include: sharding_jdbc mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
applicaiton-sharding_jdbc.yml
spring: shardingsphere: datasource: names: ds0,ds1 ds0: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1:3306/sharding-jdbc0?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root password: 222333 type: com.zaxxer.hikari.HikariDataSource ds1: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1:3306/sharding-jdbc1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root password: 222333 type: com.zaxxer.hikari.HikariDataSource sharding: tables: t_order: #key-generator: # column: id # type: SNOWFLAKE actual-data-nodes: ds$->{0..1}.t_order_$->{0..1} database-strategy: inline: sharding-column: id algorithm‐expression: ds$->{id % 2} table-strategy: inline: sharding-column: id algorithm‐expression: t_order_$->{id % 2} props: sql: show: true # 日誌顯示SQL
程式碼
本處只貼controller,其他都是程式碼生成器生成的,沒有啥業務邏輯。
Controller
package com.example.demo.controller;
import com.example.demo.entity.Order;
import com.example.demo.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/*
http://localhost:9011/order/onlyCreateOrder?userId=1&productId=1&count=10&money=100
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
OrderService orderService;
private Long id = 1L;
//只儲存訂單
@PostMapping("onlyCreateOrder")
@Transactional
public String onlyCreateOrder(Order order) {
order.setId(id++);
orderService.save(order);
return "success";
}
//只儲存訂單
@PostMapping("onlyCreateOrderError")
@Transactional
public String onlyCreateOrderError(Order order) {
order.setId(id++);
orderService.save(order);
order.setId(id++);
orderService.save(order);
int i = 1 / 0;
return "success";
}
}
測試
正常執行
訪問:http://localhost:9011/order/onlyCreateOrder?userId=1&productId=1&count=10&money=100
結果:
再次訪問:http://localhost:9011/order/onlyCreateOrder?userId=1&productId=1&count=10&money=100
結果:
丟擲異常 (支援事務)
訪問:http://localhost:9011/order/onlyCreateOrderError?userId=1&productId=1&count=10&money=100
結果:
丟擲異常,沒有資料插入。