shardingsphere官网:ShardingSphere
2024年8月12日终于解决了绝大一部分问题,现在记录一下在升级过程中遇到的问题
首先是配置
5.1.1配置是和数据库以及其他spring boot配置放到一块的,但是到5.3.2后,shardingsphere的配置单独出来,与spring boot配置放到一块的只有以下代码:
spring:
datasource:
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
url: jdbc:shardingsphere:classpath:sharding-jdbc.yml
其他的配置都放到 sharding-jdbc.yml 文件中了。就是这个配置折磨了我俩天,啊不 准确的来说是三天,其中有一天是断断续续的。
一、版本问题
首页在升级过程中遇到的第一个问题就是版本问题,因为项目原因由原来的spring boot 2.0 升级到srping boot 3.0,所以旧系统的shardingsphere 就不能用了,后面由于我对shardingsphere文档不熟悉,也不清楚版本对应问题,这里就走了很大一部分弯路,最后是我同事告诉我 shardingsphere 5.2.0和spring boot 3.0不兼容,后面我用的shardingsphere-jdbc-core 5.3.2。
这里解释一下 我为啥会用shardingsphere5.2.0 因为 这个(
shardingsphere-jdbc-core-spring-boot-starter
)在maven仓库中最高的是5.2.1 所以我想着用个 5.2.0没啥问题,但是实际上 后来在看官方文档才发现 因为spring 3.0的特殊 所以嘛 最高就是 5.2.1
二、org.yaml.snakeyaml.representer.Representer: method 'void <init>()' not found
第一次碰到这样的问题没经验,第一想法就是百度一下。看了一圈后发现基本类似的问题都说根据Maven里的地址建立一个一模一样路径的类,其他方法一直,就是新增一个无参的构造方法。我满心欢喜的拿着这个答案去解决问题。(但是不知道的就因为这个小小的改动,导致接近2天的时间白费。)结果缺失遇到了一个新的问题
三、一个null 的报错
java.lang.NullPointerException: null
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na]
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) ~[na:na]
at org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine.swapToRuleConfigurations(YamlRuleConfigurationSwapperEngine.java:55) ~[shardingsphere-infra-common-5.3.2.jar:5.3.2]
at org.apache.shardingsphere.mode.metadata.persist.service.config.database.DatabaseRulePersistService.load(DatabaseRulePersistService.java:70) ~[shardingsphere-mode-core-5.3.2.jar:5.3.2]
at org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory.createEffectiveDatabaseConfiguration(MetaDataContextsFactory.java:106) ~[shardingsphere-mode-core-5.3.2.jar:5.3.2]
at org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory.lambda$createEffectiveDatabaseConfigurations$1(MetaDataContextsFactory.java:100) ~[shardingsphere-mode-core-5.3.2.jar:5.3.2]
at java.base/java.util.stream.Collectors.lambda$toMap$68(Collectors.java:1674) ~[na:na]
at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) ~[na:na]
at java.base/java.util.Collections$2.tryAdvance(Collections.java:4853) ~[na:na]
at java.base/java.util.Collections$2.forEachRemaining(Collections.java:4861) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) ~[na:na]
at org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory.createEffectiveDatabaseConfigurations(MetaDataContextsFactory.java:99) ~[shardingsphere-mode-core-5.3.2.jar:5.3.2]
at org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory.create(MetaDataContextsFactory.java:86) ~[shardingsphere-mode-core-5.3.2.jar:5.3.2]
at org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory.create(MetaDataContextsFactory.java:68) ~[shardingsphere-mode-core-5.3.2.jar:5.3.2]
at org.apache.shardingsphere.mode.manager.standalone.StandaloneContextManagerBuilder.build(StandaloneContextManagerBuilder.java:53) ~[shardingsphere-standalone-mode-core-5.3.2.jar:5.3.2]
at org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.createContextManager(ShardingSphereDataSource.java:77) ~[shardingsphere-jdbc-core-5.3.2.jar:5.3.2]
at org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.<init>(ShardingSphereDataSource.java:65) ~[shardingsphere-jdbc-core-5.3.2.jar:5.3.2]
at org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:93) ~[shardingsphere-jdbc-core-5.3.2.jar:5.3.2]
at org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory.createDataSource(YamlShardingSphereDataSourceFactory.java:153) ~[shardingsphere-jdbc-core-5.3.2.jar:5.3.2]
at org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory.createDataSource(YamlShardingSphereDataSourceFactory.java:95) ~[shardingsphere-jdbc-core-5.3.2.jar:5.3.2]
就是这个报错折磨了我接近俩天,第一天、因为不懂这个框架 没想着去读一下源码,就直接百度,也问过chatgpt 也是没有啥头绪,没办法了 想起来可以从源头上就解决,结果这个一读就是一天,脑子昏昏沉沉的。睡了一觉 第二天去了单位继续读这个源码,读的过程中我想为啥会解析不到YamlShardingRuleConfiguration 这个配置呢,突然想着看看他的其他子类,看了俩遍也没看出个所以然来,然后又继续读源码,然后灵光一闪为啥他不走到我定义的转换类呢,是不是我写的这个类有问题 ,想到这里就开始测试,改类名,然后把pom文件中新增一个关于yml解析的依赖。
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.33</version>
</dependency>
然后把本地的maven 下载回来的关于shardingsphere的内容都删除了,然后重新下载。这次一试,哎终于启动了,而且报错也变了离成功就更近一步了。
四、Properties `strategy` can not be null when uses class based sharding strategy
出看到这个报错,很多人想的就是缺少strategy 这个属性,添加这个属性就行,我想的是看看源码,确定一下 还有没有其他属性。其中我也查阅了官方文档,但是这个官方文档说的感觉很是模糊,很多属性都没有说,不知道去哪里找。
最后找到源码文件 发现 strategy 这个属性 有3种类型
public enum ClassBasedShardingAlgorithmStrategyType {
/**
* The sharding strategy is standard.
*/
STANDARD,
/**
* The sharding strategy is complex.
*/
COMPLEX,
/**
* The sharding strategy is hint.
*/
HINT
}
最后我选择了其中一个,当时想的 我还有个自定义分片类呢,这在哪里写?然后紧接着我就发现了algorithmClassName 这个属性。很多程序员看到这个命名大概清楚了 这个属性肯定就是类名或者包含类的包的名字,然后填上去。简单测试一下。OK ,启动成功。
参考资料:
1.shardingsphere官方文档
2.SpringBoot整合ShardingSphere-JDBC 5.3.2 实现读写分离、分库分表。-优快云博客
3.百度
最后我把这个配置发出来供大家参考一下
schemaName: master1
dataSources:
master1:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://数据库链接:端口/数据库?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: root
password: root
maxPoolSize: 10
rules:
- !SHARDING
tables:
表名:
actualDataNodes: master1.表名$->{2020..2030}${(1..12).collect{t ->t.toString().padLeft(2,'0')}}
tableStrategy:
standard:
shardingColumn: PDATE
shardingAlgorithmName: admin_pdate
shardingAlgorithms:
admin_pdate:
type: CLASS_BASED
props:
strategy: STANDARD
algorithmClassName: com.admin.config.AdminPdateAlgorithm
props:
sql-show: true
其中master1也是可以换其他名称的。
pom.xml
<!--SpringBoot相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--Shardingjdbc-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>5.3.2</version>
</dependency>
<!--连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.9</version>
</dependency>
<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!--mybatis plus extension,包含了mybatis plus core-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- hutool工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId>
<version>5.8.10</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.33</version>
</dependency>