Spring Boot + ShardingSphere 踩坑记
最近在准备秋招,偷了个轮子项目之后想改个分表,于是有了这篇文章。
省流:请使用shardingsphere-jdbc 5.5.2,并根据官方5.5.2版本文档进行配置,不要使用starter。此外,如果希望使用INTERVAL分片算法,请在插入数据前将对应的字段(如create_time)手动进行赋值,否则会报错。
完整配置:
# sharding.yml
dataSources:
ds0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: <your_datasrouce_url>
username: <your_user_name>
password: <your_password>
rules:
- !SINGLE
tables:
- "*.*"
- !SHARDING
tables:
data:
actualDataNodes: ds0.data_${2024..2025}
tableStrategy:
standard:
shardingColumn: create_time
shardingAlgorithmName: create_time_interval
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
shardingAlgorithms:
create_time_interval:
type: INTERVAL
props:
datetime-pattern: "yyyy-MM-dd HH:mm:ss"
datetime-lower: '2024-01-01 00:00:00'
sharding-suffix-pattern: "yyyy"
datetime-interval-amount: 1
datetime-interval-unit: YEARS
keyGenerators:
snowflake:
type: SNOWFLAKE
props:
sql-show: true
# application.yml
spring:
datasource:
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
url: jdbc:shardingsphere:classpath:sharding.yml
我很少用史来形容一个东西,上一个能被我如此评价的是微信小程序,现在又多了一个ShardingSphere。
最史的东西莫过于官方文档。很难想象在5202年的今天,一个Apache顶级项目的文档能够如此糟糕——哪怕是微信小程序在经过更新后,如今的文档已经勉强够看了,而在我看来ShardingSphere的文档甚至连更新前的微信小程序文档都远远不如,以至于我浪费了整整两天时间在毫无意义的试错与改配置上。
目前网上的大多数材料都是基于starter的,并且LLM给出的配置也大多基于starter,但是只要从官方网站点进官方文档,里面根本找不到配置starter的说明,只有人为地在搜索引擎里把ShardingSphere和Spring Boot一起搜索,才会找到一个有Spring Boot Starter配置的文档——而当你从官方的文档库里点进这个版本的文档,Spring Boot Starter这一项又会神秘消失。
按照好不容易找到的starter配置说明改好,点击启动后又会被各种莫名其妙的错误折磨,我遇到的包括但不限于提示内存泄漏启动不了、Hikari连接超时、明明配置了但框架拿到的属性值为null等。
于是开始考虑对starter进行降级,从被官方雪藏的v4.x的文档里翻出starter的配置说明并辛辛苦苦改好后,又遇到了各种莫名其妙的错误导致业务逻辑跑不通。
之后去Github上翻Issue,维护者直接告诉你starter不维护了,反手把Issue关了。
然后根据开发者的建议换成jdbc方式,发现按照官方文档给的JDBC启动流程根本跑不起来。当然并不是所有版本都是这样——只不过我恰好用的是跑不起来的版本。
之后我无计可施,只能挨个尝试不同版本——索性我是幸运的,用之前starter的版本试了两三次之后换上最新版就好了。
这个过程中,有些版本能用搜索引擎搜出来Spring Boot的配置方法,有些版本搜不出来。但你别想着大版本号下的配置格式是一致的——因为哪怕只是一个小版本的更新,配置格式都需要跟着一起修改,简直让人匪夷所思,更别提数据源的名称一会儿是url,一会儿又变成jdbc_url,我完全搞不懂这个名称有什么升级的意义。
务实一点,我劝你们,把文档,版本号的这个理念先搞懂。starter用的蛮好的,你去把他废弃了干什么,你文档不更新,应用起不来,你倒告诉我怎么解释,脸都不要了。