当前位置:Gxlcms > 数据库问题 > SpringBoot使用sharding-jdbc分库分表

SpringBoot使用sharding-jdbc分库分表

时间:2021-07-01 10:21:17 帮助过:356人阅读

  • <groupId>org.springframework.boot</groupId> 
  • <artifactId>spring-boot-starter-parent</artifactId> 
  • <version>1.5.16.RELEASE</version> 
  • <relativePath/> <!-- lookup parent from repository --> 
  • </parent> 
  •  
  • <properties> 
  • <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
  • <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
  • <java.version>1.8</java.version> 
  • </properties> 
  •  
  • <dependencies> 
  • <dependency> 
  • <groupId>org.springframework.boot</groupId> 
  • <artifactId>spring-boot-starter-data-jpa</artifactId> 
  • </dependency> 
  • <dependency> 
  • <groupId>org.springframework.boot</groupId> 
  • <artifactId>spring-boot-starter-web</artifactId> 
  • </dependency> 
  •  
  • <dependency> 
  • <groupId>mysql</groupId> 
  • <artifactId>mysql-connector-java</artifactId> 
  • <scope>runtime</scope> 
  • </dependency> 
  • <dependency> 
  • <groupId>org.springframework.boot</groupId> 
  • <artifactId>spring-boot-starter-test</artifactId> 
  • <scope>test</scope> 
  • </dependency> 
  • <dependency> 
  • <groupId>com.dangdang</groupId> 
  • <artifactId>sharding-jdbc-core</artifactId> 
  • <version>1.4.2</version> 
  • </dependency> 
  • <dependency> 
  • <groupId>com.alibaba</groupId> 
  • <artifactId>druid</artifactId> 
  • <version>1.0.12</version> 
  • </dependency> 
  •  
  • <dependency> 
  • <groupId>com.dangdang</groupId> 
  • <artifactId>sharding-jdbc-self-id-generator</artifactId> 
  • <version>1.4.2</version> 
  • </dependency> 
  •  
  •  
  • </dependencies> 
  • 目前好像不支持SpringBoot2.0以上的版本。

    2.2编写实体类及建库建表

    目标:
    db0
    ├── t_order_0 user_id为偶数 order_id为偶数
    ├── t_order_1 user_id为偶数 order_id为奇数
    db1
    ├── t_order_0 user_id为奇数 order_id为偶数
    ├── t_order_1 user_id为奇数 order_id为奇数


    1. 创建两个数据库 ds_0 和 ds_1,编码类型UTF-8。
    2. 每个库分表创建两个表t_order_0和t_order_1,sql语句如下:

      DROP TABLE IF EXISTS t_order_0;
      CREATE TABLE t_order_0 (
      order_id bigint(20) NOT NULL,
      user_id bigint(20) NOT NULL,
      PRIMARY KEY (order_id)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    3. 新建类Order,代码如下
    1. package cn.sp.bean; 
    2.  
    3. import javax.persistence.Entity; 
    4. import javax.persistence.Id; 
    5. import javax.persistence.Table; 
    6.  
    7. /** 
    8. * Created by 2YSP on 2018/9/23. 
    9. */ 
    10. @Entity 
    11. @Table(name="t_order"
    12. public class Order
    13. @Id 
    14. private Long orderId; 
    15.  
    16. private Long userId; 
    17.  
    18. public Long getOrderId()
    19. return orderId; 
    20.  
    21. public void setOrderId(Long orderId)
    22. this.orderId = orderId; 
    23.  
    24. public Long getUserId()
    25. return userId; 
    26.  
    27. public void setUserId(Long userId)
    28. this.userId = userId; 
    29.  

    这里需要注意 @Id注解不要导错包,之前我就遇到过这个问题。
    4.配置文件application.yml

    1. server: 
    2. port: 8000 
    3. spring: 
    4. jpa: 
    5. database: mysql 
    6. show-sql: true 
    7. hibernate: 
    8. ## 自己建表 
    9. ddl-auto: none 
    10. application: 
    11. name: sharding-jdbc-first 

    这里要注意的是spring-data-jpa默认会自己建表,这里我们要手动建立,所以需要将ddl-auto属性设置为none

    2.3自定义分库分表算法

    1.分库算法类需要实现SingleKeyDatabaseShardingAlgorithm<T>接口,这是一个泛型接口,T代表分库依据的字段的类型,比如我们根据userId%2来分库,userId是Long型的,这里的T就是Long。

    1. public cl

    人气教程排行