准备数据库服务
创建docker-compose文件
version: '3'
services:
lx-server-user:
image: mysql:8.0.29
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_PASSWORD: 123456
ports:
- 3501:3306
container_name: "lx-server-user"
lx-server-order:
image: mysql:8.0.29
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_PASSWORD: 123456
ports:
- 3502:3306
container_name: "lx-server-order"
启动数据库
docker-compose -f docker-compose-mysql.yml up -d
3501准备数据
创建数据库
CREATE DATABASE db_user;
创建表
CREATE TABLE t_user (
id BIGINT AUTO_INCREMENT,
uname VARCHAR(30),
PRIMARY KEY (id)
);
3502准备数据
CREATE DATABASE db_order;
CREATE TABLE t_order (
id BIGINT AUTO_INCREMENT,
order_no VARCHAR(30),
user_id BIGINT,
amount DECIMAL(10,2),
PRIMARY KEY(id)
);
数据分片官网配置
rules:
- !SHARDING
tables: # 数据分片规则配置
<logic-table-name> (+): # 逻辑表名称
actualDataNodes (?): # 由数据源名 + 表名组成(参考 Inline 语法规则)
databaseStrategy (?): # 分库策略,缺省表示使用默认分库策略,以下的分片策略只能选其一
standard: # 用于单分片键的标准分片场景
shardingColumn: # 分片列名称
shardingAlgorithmName: # 分片算法名称
complex: # 用于多分片键的复合分片场景
shardingColumns: # 分片列名称,多个列以逗号分隔
shardingAlgorithmName: # 分片算法名称
hint: # Hint 分片策略
shardingAlgorithmName: # 分片算法名称
none: # 不分片
tableStrategy: # 分表策略,同分库策略
keyGenerateStrategy: # 分布式序列策略
column: # 自增列名称,缺省表示不使用自增主键生成器
keyGeneratorName: # 分布式序列算法名称
autoTables: # 自动分片表规则配置
t_order_auto: # 逻辑表名称
actualDataSources (?): # 数据源名称
shardingStrategy: # 切分策略
standard: # 用于单分片键的标准分片场景
shardingColumn: # 分片列名称
shardingAlgorithmName: # 自动分片算法名称
bindingTables (+): # 绑定表规则列表
- <logic_table_name_1, logic_table_name_2, ...>
- <logic_table_name_1, logic_table_name_2, ...>
broadcastTables (+): # 广播表规则列表
- <table-name>
- <table-name>
defaultDatabaseStrategy: # 默认数据库分片策略
defaultTableStrategy: # 默认表分片策略
defaultKeyGenerateStrategy: # 默认的分布式序列策略
defaultShardingColumn: # 默认分片列名称
# 分片算法配置
shardingAlgorithms:
<sharding-algorithm-name> (+): # 分片算法名称
type: # 分片算法类型
props: # 分片算法属性配置
# ...
# 分布式序列算法配置
keyGenerators:
<key-generate-algorithm-name> (+): # 分布式序列算法名称
type: # 分布式序列算法类型
props: # 分布式序列算法属性配置
# ...
创建实体类
@TableName("t_order")
@Data
public class Order {
@TableId(type = IdType.AUTO)
private Long id;
private String orderNo;
private Long userId;
private BigDecimal amount;
}
创建Mapper
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
}
配置垂直分片
# 应用名称
spring:
application:
name: sharding-jdbc-demo
profiles:
active: dev
shardingsphere:
mode:
type: Memory
props:
sql-show: true
# 配置真实数据源
datasource:
names: server-user,server-order
# 配置第 1 个数据源
server-user:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3501/db_user?allowPublicKeyRetrieval=true&useSSL=false
username: root
password: 123456
# 配置第 2 个数据源
server-order:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3502/db_order?allowPublicKeyRetrieval=true&useSSL=false
username: root
password: 123456
# 标准分片表配置(数据节点)
rules:
sharding:
tables:
#逻辑表名
t_user:
## 值由数据源名 + 表名组成,以小数点分隔。
actualDataNodes: server-user.t_user
t_order:
## 值由数据源名 + 表名组成,以小数点分隔。
actualDataNodes: server-order.t_order
测试垂直分片
/**
* 垂直分片:插入数据测试
*/
@Test
public void testInsertOrderAndUser(){
TUser user = new TUser();
user.setUname("数据分片");
userMapper.insert(user);
Order order = new Order();
order.setOrderNo("0001");
order.setUserId(user.getId());
order.setAmount(new BigDecimal(100));
orderMapper.insert(order);
}
1 2 3 4 分别为 逻辑SQL、实际SQL、逻辑SQL、 实际SQL。
测试垂直分片查询数据
/**
* 垂直分片:查询数据测试
*/
@Test
public void testSelectFromOrderAndUser(){
TUser user = userMapper.selectById(1L);
Order order = orderMapper.selectById(1L);
}
可关注公众号 佳哇程序员
或直接扫码关注