记录一次shardingsphere从5.1.1 升级到5.3.2的曲折过程

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 实现读写分离、分库分表。-CSDN博客

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>

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值