|
|
5 ngày trước cách đây | |
|---|---|---|
| .. | ||
| doc | 5 ngày trước cách đây | |
| src | 5 ngày trước cách đây | |
| README-ShardingSphere配置说明.md | 5 ngày trước cách đây | |
| pom.xml | 5 ngày trước cách đây | |
本项目使用ShardingSphere实现分库分表功能,主要涉及以下配置文件和组件:
databaseName: sharding-db # 重要:必须与@DS注解中的名称一致
dataSources:
ds0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8
username: root
password: root
rules:
- !SHARDING
tables:
sys_log: # 分表的逻辑表名
actualDataNodes: ds0.sys_log$->{0..1} # 实际表:sys_log0, sys_log1
tableStrategy:
standard:
shardingColumn: log_type # 分片字段
shardingAlgorithmName: table_inline
shardingAlgorithms:
table_inline:
type: INLINE
props:
algorithm-expression: sys_log$->{log_type % 2} # 根据log_type取模分表
databaseName: sharding-db # 与@DS注解保持一致
dataSources:
ds0: # 主库
jdbcUrl: jdbc:mysql://localhost:3306/jeecg-boot?...
ds1: # 从库
jdbcUrl: jdbc:mysql://localhost:3306/jeecg-boot2?...
rules:
- !SHARDING
tables:
sys_log:
actualDataNodes: ds$->{0..1}.sys_log$->{0..1} # 2库2表
databaseStrategy: # 分库策略
standard:
shardingColumn: operate_type
shardingAlgorithmName: database-inline
tableStrategy: # 分表策略
standard:
shardingColumn: log_type
shardingAlgorithmName: table-classbased
- !READWRITE_SPLITTING # 读写分离
dataSources:
prds:
writeDataSourceName: ds0 # 写库
readDataSourceNames: [ds1] # 读库
spring:
datasource:
dynamic:
datasource:
# 普通数据源
master:
url: jdbc:mysql://localhost:3306/jeecg-boot
username: root
password: root
# ShardingSphere分片数据源
sharding-db: # 数据源名称,对应@DS("sharding-db")
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
# 本地配置文件方式
url: jdbc:shardingsphere:classpath:sharding.yaml
# 或者Nacos配置方式
url: jdbc:shardingsphere:nacos:sharding.yaml?serverAddr=${spring.cloud.nacos.config.server-addr}&namespace=${spring.cloud.nacos.config.namespace}&group=${spring.cloud.nacos.config.group}
关键点:
sharding-db 是数据源的名称标识@DS("sharding-db")注解保持一致@Service
@DS("sharding-db") // 指定使用sharding-db数据源
public class ShardingSysLogServiceImpl extends ServiceImpl<ShardingSysLogMapper, ShardingSysLog>
implements IShardingSysLogService {
}
配置关系说明:
@DS("sharding-db") 注解告诉MyBatis-Plus使用名为sharding-db的数据源sharding-db对应application-dev.yml中配置的数据源名称-- 在jeecg-boot数据库中创建分表
CREATE TABLE sys_log0 LIKE sys_log;
CREATE TABLE sys_log1 LIKE sys_log;
spring:
datasource:
dynamic:
datasource:
sharding-db:
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
url: jdbc:shardingsphere:classpath:sharding.yaml
src/main/resources/目录下databaseName: sharding-db与数据源名称一致@DS("sharding-db") // 使用分片数据源
public class ShardingSysLogServiceImpl {
// 业务代码
}
// 插入数据时会自动根据log_type字段进行分表
shardingSysLogService.save(sysLog);
// 查询时也会根据分片规则路由到正确的表
shardingSysLogService.list();
启动项目后查看日志,如果看到类似输出说明配置成功:
Logic SQL: INSERT INTO sys_log (log_type, content) VALUES (?, ?)
Actual SQL: ds0 ::: INSERT INTO sys_log0 (log_type, content) VALUES (?, ?)
名称一致性:确保以下三处名称完全一致
sharding-dbsharding-db@DS("sharding-db")表结构一致:所有分片表的结构必须完全一致
分片键选择:选择分布均匀的字段作为分片键,避免数据倾斜
事务支持:单表事务正常,跨表事务需要注意
这样配置后,通过ShardingSysLogServiceImpl操作的数据会自动根据分片规则分布到不同的表中。