1. 程式人生 > 其它 >Sharding-JDBC系列--分庫分表

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

結果:

丟擲異常,沒有資料插入。