方便更快捷的说明问题,可以按需填写(可删除)
使用环境:
Windows 22000.493 , IntelliJ IDEA 2021.3.2, Alibaba DragonWell 8u312
场景、问题:
-
尝试在ShardingSphere JDBC
5.1.0
下配置读写分离, 在org.apache.shardingsphere.readwritesplitting.checker.AbstractReadwriteSplittingRuleConfigurationChecker
处,dataSources
的type
取得为null
,从而抛出NPE. 相关示例仓库为 linghengqian/shardingsphere-h2-test (github.com) . -
未在 Spring Boot Start 配置 :: ShardingSphere (apache.org) 看到API调整.
-
相关application.yml配置为
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