基于Spring boot做分库分表,yml配置加自定义分表策略,操作简单,也支持复合栏位的分表策略定义,更多详见,
官方配置说明:
https://shardingsphere.apache.org/document/legacy/3.x/document/cn/manual/sharding-jdbc/configuration/config-spring-boot/
pom配置
<?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.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhoudy</groupId>
<artifactId>sharding-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sharding-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.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--Mybatis-Plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
<!--shardingsphere start-->
<!-- for spring boot -->
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!-- for spring namespace -->
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>3.1.0</version>
</dependency>
<!--shardingsphere end-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
yml配置
spring:
application:
name: sharding-demo
main:
allow-bean-definition-overriding: true #设置为true,表示后发现的bean会覆盖之前相同名称的bean。
server:
port: 9961
sharding:
jdbc:
datasource:
names: db0,db1
db0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver # 使用新版本驱动,则要指定区时serverTimezone
jdbc-url: jdbc:mysql://localhost:3306/db0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
db1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
# 水平拆分的数据库(表) 配置分库 + 分表策略 行表达式分片策略
# 分库策略
config:
sharding:
default-database-strategy:
inline:
sharding-column: id
algorithm-expression: db$->{id %2}
# 分表策略 其中user为逻辑表 分表主要取决于age字段
tables:
user:
actual-data-nodes: db$->{0..1}.user_$->{0..1}
table-strategy:
# inline:
# sharding-column: age
# algorithm-expression: user_$->{age %2} # 分片算法表达式
standard: #用于单分片键的标准分片场景
sharding-column: age
precise-algorithm-class-name: com.zhoudy.shardingdemo.config.MyPreciseShardingAlgorithm
range-algorithm-class-name: com.zhoudy.shardingdemo.config.MyPreciseShardingAlgorithm
key-generator-column-name: id
#打印执行的数据库以及语句
props:
sql:
show: true
#mybatis-plus映射mapper文件
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.zhoudy.shardingdemo.entity
自定义分片算法:
package com.zhoudy.shardingdemo.config;
import io.shardingsphere.api.algorithm.sharding.PreciseShardingValue;
import io.shardingsphere.api.algorithm.sharding.RangeShardingValue;
import io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm;
import io.shardingsphere.api.algorithm.sharding.standard.RangeShardingAlgorithm;
import lombok.extern.slf4j.Slf4j;
import java.util.Collection;
@Slf4j
public class MyPreciseShardingAlgorithm implements PreciseShardingAlgorithm, RangeShardingAlgorithm {
@Override
public String doSharding(Collection collection, PreciseShardingValue preciseShardingValue) {
//collection:[user_0, user_1]
// preciseShardingValue:PreciseShardingValue(logicTableName=user, columnName=age, value=20)
log.info("collection:{}",collection);
log.info("preciseShardingValue:{}",preciseShardingValue);
int age = (int) preciseShardingValue.getValue();
String index = String.valueOf(age % 2);
String tableReal = preciseShardingValue.getLogicTableName().concat("_").concat(index);
return tableReal;
}
@Override
public Collection<String> doSharding(Collection collection, RangeShardingValue rangeShardingValue) {
return null;
}
}