Shardingsphere 4
1. 依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
2. yml配置
spring:
main:
shardingsphere:
datasource:
#数据库名称 可配置多个
names: db0
db0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:1111/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useAffectedRows=true&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 111
#最大连接数
max-connections-size-per-query: 20
filters: stat
initial-size: 1
max-active: 10
max-open-prepared-statements: 10
max-wait: 60000
min-evictable-idle-time-millis: 300000
min-idle: 1
pool-prepared-statements: true
test-on-borrow: false
test-on-return: false
test-while-idle: true
time-between-eviction-runs-millis: 60000
validation-query: select 'x'
filter:
# 开启druiddatasource的状态监控
stat:
enabled: true
db-type: mysql
# 开启慢sql监控,超过2s 就认为是慢sql,记录到日志中
log-slow-sql: true
slow-sql-millis: 1000
# 日志监控,使用slf4j 进行日志输出
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: true
login-username: root
login-password: root
allow: 127.0.0.1
sharding:
default-data-source-name: db0
tables:
#逻辑表名称
order:
# 分表策略
actual-data-nodes: db0.order_$->{0..1}
table-strategy:
#使用内联分片策略
inline:
#分片列名称
sharding-column: id
#分片算法表达式
algorithm-expression: order_$->{id % 2}
enabled: true
props:
sql:
#日志打印
show: true
3.问题点
3.1 加载慢(元数据加载整个库)
日志:
2024-03-12 10:27:31.986 [main] INFO ShardingSphere-metadata - Loading 1 logic tables' meta data.
2024-03-12 10:27:33.014 [main] INFO ShardingSphere-metadata - Loading 354 tables' meta data.
2024-03-12 10:27:38.776 [main] INFO ShardingSphere-metadata - Meta data load finished, cost 6831 milliseconds.
原因:
- 由于配置中只配置了一个数据源,ShardingSphere会默认将这个数据源当做默认数据源,可以看到我的配置里面是没有配置default-data-source-name这个配置的,而ShardingSphere加载默认数据源的表是全库的表都加载的,即是日志上看到的加载了354个表。就是因为其将我配置的那个数据源当做了默认数据源,导致加载了6831 milliseconds
解决:
多引入一个数据源,可以与之前的数据源相同或不同
且不配置默认数据源 spring.shardingsphere.sharding.default-data-source-name则不会加载整个库的元数据
3.2 Time格式转换
引入依赖即可
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.1</version>
</dependency>
Shardingsphere 5
1. 依赖
<!-- 分表依赖 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>5.4.0</version>
</dependency>
<!-- 解析yaml -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.33</version>
</dependency>
官方文档参考:文档
2.引入流程
3. yml配置
databaseName: db0
# 数据源配置
dataSources:
db0:
# 数据库连接池类名称
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
# 数据库驱动类名
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://191.161.1.151:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useAffectedRows=true&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: qqqqqqqq
druid:
filters: stat
initial-size: 1
max-active: 10
max-open-prepared-statements: 10
max-wait: 60000
min-evictable-idle-time-millis: 300000
min-idle: 1
pool-prepared-statements: true
test-on-borrow: false
test-on-return: false
test-while-idle: true
time-between-eviction-runs-millis: 60000
validation-query: select 'x'
filter:
# 开启druiddatasource的状态监控
stat:
enabled: true
db-type: mysql
# 开启慢sql监控,超过2s 就认为是慢sql,记录到日志中
log-slow-sql: true
slow-sql-millis: 1000
# 日志监控,使用slf4j 进行日志输出
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: true
login-username: root
login-password: root
allow: 191.166.1.111
# 规则配置
rules:
- !SINGLE
tables:
- "*.*" # 加载全部单表
- !SHARDING
tables:
# 逻辑表名称
b_order:
# 行表达式标识符可以使用 ${...} 或 $->{...},但前者与 Spring 本身的属性文件占位符冲突,因此在 Spring 环境中使用行表达式标识符建议使用 $->{...}
actualDataNodes: db0.b_order_$->{0..1}
# 分表策略
tableStrategy:
standard:
# 分片列名称
shardingColumn: user_id
# 分片算法名称
shardingAlgorithmName: orderTableInline
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
# 分片算法配置
shardingAlgorithms:
orderTableInline:
type: INLINE
props:
algorithm-expression: b_order_$->{user_id % 2}
keyGenerators:
snowflake:
type: SNOWFLAKE
# 属性配置
props:
# 展示修改以后的sql语句
sql-show: true
4.JDBC驱动
spring:
datasource:
# 指定 YAML 配置文件
url: jdbc:shardingsphere:classpath:sharding.yaml
# 配置 DataSource Driver
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
5.问题
5.1 java.lang.NoSuchMethodError: org.apache.shardingsphere.infra.util.yaml.constructor.ShardingSphereYamlConstructor$1.setCodePointLimit(I)V
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.33</version>
</dependency>
5.2 加载配置报错Unable to find property 'databaseName (db0)' on class: org.apache.shardingsphere.driver.api.yaml.YamlJDBCConfiguration
org.yaml.snakeyaml.constructor.ConstructorException: Cannot create property=rules for JavaBean=org.apache.shardingsphere.infra.yaml.config.pojo.YamlRootConfiguration@74525630
in 'reader', line 1, column 1:
dataSources:
原因:yaml校验严格,yaml文件内配置项 有错误
可能属性配置名称有误 或 驼峰问题
5.3 java.sql.SQLException: url not set
配置的连接池
HikariDataSource是jdbcUrl,而druid是url
5.4 snowflake algorithm does not exist in
策略里面没有配置分布式序列算法配置
5.5 ERROR Cause: java.sql.SQLException: Table 'order' doesn't exist
表分片策略配置不完整 如:其他不需要分表的表没有加入到shardingsphere管理
5.6配置注册中心不支持
6.读取注册中心nacos
基于实现读取配置类源码
创建factory文件 进行读取对应的配置信息