针对在 ShardingSphere JDBC 5.1.0 中配置读写分离规则, checker 检查报 null 的问题

方便更快捷的说明问题,可以按需填写(可删除)

使用环境:

Windows 22000.493 , IntelliJ IDEA 2021.3.2, Alibaba DragonWell 8u312

场景、问题:

spring:
  shardingsphere:
    datasource:
      names: ds0,ds1,ds2
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: org.h2.Driver
        jdbc-url: jdbc:h2:mem:master;MODE=MYSQL;DATABASE_TO_LOWER=TRUE;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
        username: lingh
        password: ""
      ds1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: org.h2.Driver
        jdbc-url: jdbc:h2:mem:slave1;MODE=MYSQL;DATABASE_TO_LOWER=TRUE;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
        username: lingh
        password: ""
      ds2:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: org.h2.Driver
        jdbc-url: jdbc:h2:mem:slave2;MODE=MYSQL;DATABASE_TO_LOWER=TRUE;INIT=RUNSCRIPT FROM 'classpath:db/schema.sql'
        username: lingh
        password: ""
    rules:
      sharding:
        tables:
          t_order:
            actualDataNodes: ds0.t_order$->{0..1}
            tableStrategy:
              standard:
                shardingColumn: order_id
                shardingAlgorithmName: lingh-inline
            keyGenerateStrategy:
              column: order_id
              keyGeneratorName: lingh-snowflake
        sharding-algorithms:
          lingh-inline:
            type: INLINE
            props:
              algorithm-expression: t_order$->{order_id % 2}
              allow-range-query-with-inline-sharding: false
        key-generators:
          lingh-snowflake:
            type: SNOWFLAKE
            props:
              worker-id: 0
              max-vibration-offset: 1
              max-tolerate-time-difference-milliseconds: 10
      readwrite-splitting:
        data-sources:
          lingh-readwrite-data-sources:
            write-data-source-name: ds0
            read-data-source-names:
              - ds1
              - ds2
            load-balancer-name: lingh-load-balance-algorithm
        load-balancers:
          lingh-load-balance-algorithm:
            type: ROUND_ROBIN
logging:
  level:
    org.apache.shardingsphere: debug

已进行操作:

调整com.h2database:h2版本为 1.4.200 验证依然存在问题. 若将org.apache.shardingsphere:shardingsphere-jdbc-core-spring-boot-starter调整为5.0.0则正常启动. 不确定API变动的位置.

现状:

启动时抛出异常. 日志如下

Caused by: java.lang.NullPointerException: null
	at org.apache.shardingsphere.readwritesplitting.checker.AbstractReadwriteSplittingRuleConfigurationChecker.lambda$checkDataSources$0(AbstractReadwriteSplittingRuleConfigurationChecker.java:41) ~[shardingsphere-readwrite-splitting-core-5.1.0.jar:5.1.0]
	at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_312]
	at org.apache.shardingsphere.readwritesplitting.checker.AbstractReadwriteSplittingRuleConfigurationChecker.checkDataSources(AbstractReadwriteSplittingRuleConfigurationChecker.java:40) ~[shardingsphere-readwrite-splitting-core-5.1.0.jar:5.1.0]
	at org.apache.shardingsphere.readwritesplitting.checker.AbstractReadwriteSplittingRuleConfigurationChecker.check(AbstractReadwriteSplittingRuleConfigurationChecker.java:36) ~[shardingsphere-readwrite-splitting-core-5.1.0.jar:5.1.0]
	at org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.lambda$null$0(ShardingSphereDataSource.java:69) ~[shardingsphere-jdbc-core-5.1.0.jar:5.1.0]
	at java.util.Optional.ifPresent(Optional.java:159) ~[na:1.8.0_312]
	at org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.lambda$checkRuleConfiguration$1(ShardingSphereDataSource.java:69) ~[shardingsphere-jdbc-core-5.1.0.jar:5.1.0]
	at java.util.ArrayList.forEach(ArrayList.java:1259) ~[na:1.8.0_312]
	at org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.checkRuleConfiguration(ShardingSphereDataSource.java:69) ~[shardingsphere-jdbc-core-5.1.0.jar:5.1.0]
	at org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.<init>(ShardingSphereDataSource.java:62) ~[shardingsphere-jdbc-core-5.1.0.jar:5.1.0]
	at org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:77) ~[shardingsphere-jdbc-core-5.1.0.jar:5.1.0]
	at org.apache.shardingsphere.spring.boot.ShardingSphereAutoConfiguration.shardingSphereDataSource(ShardingSphereAutoConfiguration.java:93) ~[shardingsphere-jdbc-core-spring-boot-starter-5.1.0.jar:5.1.0]
	at org.apache.shardingsphere.spring.boot.ShardingSphereAutoConfiguration$$EnhancerBySpringCGLIB$$e2b3754.CGLIB$shardingSphereDataSource$2(<generated>) ~[shardingsphere-jdbc-core-spring-boot-starter-5.1.0.jar:5.1.0]
	at org.apache.shardingsphere.spring.boot.ShardingSphereAutoConfiguration$$EnhancerBySpringCGLIB$$e2b3754$$FastClassBySpringCGLIB$$766ab8f3.invoke(<generated>) ~[shardingsphere-jdbc-core-spring-boot-starter-5.1.0.jar:5.1.0]
	at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.3.15.jar:5.3.15]
	at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.3.15.jar:5.3.15]
	at org.apache.shardingsphere.spring.boot.ShardingSphereAutoConfiguration$$EnhancerBySpringCGLIB$$e2b3754.shardingSphereDataSource(<generated>) ~[shardingsphere-jdbc-core-spring-boot-starter-5.1.0.jar:5.1.0]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_312]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_312]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_312]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_312]
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.15.jar:5.3.15]
	... 20 common frames omitted
        read-data-source-names:
          - ds1
          - ds2

修改成 :

        read-data-source-names: ds1, ds2

麻烦再试试

貌似你的配置

load-balancer-name: lingh-load-balance-algorithm

位置也有点问题.

@zjcnb

readwrite-splitting:
        data-sources:
          lingh-readwrite-data-sources:
            write-data-source-name: ds0
            read-data-source-names: ds1,ds2
            load-balancer-name: ROUND_ROBIN
readwrite-splitting:
        data-sources:
          lingh-readwrite-data-sources:
            write-data-source-name: ds0
            read-data-source-names: ds1,ds2
          load-balancer-name: ROUND_ROBIN

这样呢?

autoAwareDataSouceName 针对于静态读写分离不是必填项, 动态读写分离是必填项.

当前 5.1.0 的文档有点问题, 直接看 master 的文档吧.

貌似你的配置还缺少了 type : Static ? 参考下 master 文档再配置下吧

1 个赞
  • 更改如下后正常, 确认是文档问题, master分支的文档是正确的. 看起来由于版本封档 ,没办法提交PR更新 5.1.0 的文档内容. 再次感谢你的回答.
    readwrite-splitting:
        data-sources:
          lingh-readwrite-data-sources:
            type: Static
            props:
              write-data-source-name: ds0
              read-data-source-names: ds1,ds2
            load-balancer-name: ROUND_ROBIN
京ICP备2021015875号