业务需求:
- 我们有一个大的文档表,内包含用户id和企业id,考虑到后续数据量较大,现在需要对其进行分表。
- 要求:每个企业一张表
团队想到的方案:
- 使用mybatis-plus的动态表名插件(对原有代码有侵入,如果是xml写的sql,侵入更大)
- sharing-sphere中间件(无侵入,改动较小,只需要配置相关分片算法即可)
- …
最终方案:
- 使用 sharing-sphere中间件
pom依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
sharing-sphere配置
spring:
shardingsphere:
props:
sql:
# 打印sql
show: true
datasource:
names: ds0
ds0:
jdbc-url: jdbc:mysql://192.168.111.37:3306/edniutrans_cloud?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
sharding:
# 数据分片规则配置
tables:
# 逻辑表名称
document_trans:
# 由数据源名 + 表名组成(参考 Inline 语法规则)
# actual-data-nodes: ds0.document_trans_? (?代表任意)
actual-data-nodes: ds0.document_trans_?
# 分表策略
table-strategy:
# 用于单分片键的标准分片场景
standard:
# 自定义分片算法实现类
precise-algorithm-class-name: com.niutrans.vip.document.business.algorithm.table.MyTableStandardPreciseAlgorithm
# 分片列名称
sharding-column: enterprise_id
自定义分片实现类
public class MyTableStandardPreciseAlgorithm implements PreciseShardingAlgorithm<Integer> {
@Override
public String doSharding(Collection<String> collection, PreciseShardingValue<Integer> preciseShardingValue) {
return preciseShardingValue.getLogicTableName() + "_" + preciseShardingValue.getValue();
}
}
使用时注意事项
使用shardingsphere分表后,如何正确使用xml实体映射和mp提供的api
补充:Hikari连接池配置
## 数据库配置
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username = root
spring.datasource.password = root
## Hikari 连接池配置 ------ 详细配置请访问:https://github.com/brettwooldridge/HikariCP
# 连接池中允许的最小连接数。缺省值:10
spring.datasource.hikari.minimum-idle=10
# 连接池中允许的最大连接数。缺省值:10
spring.datasource.hikari.maximum-pool-size=100
# 自动提交
spring.datasource.hikari.auto-commit=true
# 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
spring.datasource.hikari.idle-timeout=30000
# 连接池名字
spring.datasource.hikari.pool-name=FlyduckHikariCP
# 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒
spring.datasource.hikari.max-lifetime=1800000
# 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
spring.datasource.hikari.connection-timeout=30000
# 数据库连接测试语句
spring.datasource.hikari.connection-test-query=SELECT 1**