行内表达式报错

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

使用环境

shardingsphere-JDBC 版本 5.1.0

场景、问题:

actualDataNodes 中使用inline表达式报错,配置如下

      sharding_build_record:
        actualDataNodes: sharding.build_record${ 0..9 }
        tableStrategy:
          standard:
            shardingColumn: build_record_id
            shardingAlgorithmName: algo_1

报错信息如下:

Caused by: java.lang.AbstractMethodError: org.codehaus.groovy.transform.stc.AbstractExtensionMethodCache.getDisablePropertyName()Ljava/lang/String;
	at org.codehaus.groovy.transform.stc.AbstractExtensionMethodCache.<init>(AbstractExtensionMethodCache.java:52) ~[groovy-4.0.3.jar:4.0.3]
	at org.codehaus.groovy.macro.transform.MacroMethodsCache.<init>(MacroMethodsCache.java:39) ~[groovy-macro-3.0.13.jar:3.0.13]
	at org.codehaus.groovy.macro.transform.MacroMethodsCache.<clinit>(MacroMethodsCache.java:37) ~[groovy-macro-3.0.13.jar:3.0.13]
	at org.codehaus.groovy.macro.transform.MacroCallTransformingVisitor.<clinit>(MacroCallTransformingVisitor.java:62) ~[groovy-macro-3.0.13.jar:3.0.13]
	at org.codehaus.groovy.macro.transform.MacroTransformation.getTransformer(MacroTransformation.java:45) ~[groovy-macro-3.0.13.jar:3.0.13]
	at org.codehaus.groovy.ast.MethodCallTransformation.visit(MethodCallTransformation.java:31) ~[groovy-4.0.3.jar:4.0.3]
	at org.codehaus.groovy.transform.ASTTransformationVisitor.lambda$addPhaseOperationsForGlobalTransforms$5(ASTTransformationVisitor.java:377) ~[groovy-4.0.3.jar:4.0.3]
	at org.codehaus.groovy.control.CompilationUnit$ISourceUnitOperation.doPhaseOperation(CompilationUnit.java:896) ~[groovy-4.0.3.jar:4.0.3]
	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:692) ~[groovy-4.0.3.jar:4.0.3]
	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:666) ~[groovy-4.0.3.jar:4.0.3]
	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:373) ~[groovy-4.0.3.jar:4.0.3]
	at groovy.lang.GroovyClassLoader.lambda$parseClass$2(GroovyClassLoader.java:316) ~[groovy-4.0.3.jar:4.0.3]
	at org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163) ~[groovy-4.0.3.jar:4.0.3]
	at org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154) ~[groovy-4.0.3.jar:4.0.3]
	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:314) ~[groovy-4.0.3.jar:4.0.3]
	at groovy.lang.GroovyShell.parseClass(GroovyShell.java:572) ~[groovy-4.0.3.jar:4.0.3]
	at groovy.lang.GroovyShell.parse(GroovyShell.java:585) ~[groovy-4.0.3.jar:4.0.3]
	at groovy.lang.GroovyShell.parse(GroovyShell.java:639) ~[groovy-4.0.3.jar:4.0.3]
	at groovy.lang.GroovyShell.parse(GroovyShell.java:625) ~[groovy-4.0.3.jar:4.0.3]
	at groovy.lang.GroovyShell.parse(GroovyShell.java:634) ~[groovy-4.0.3.jar:4.0.3]
	at org.apache.shardingsphere.infra.expr.InlineExpressionParser.evaluate(InlineExpressionParser.java:110) ~[shardingsphere-infra-common-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.infra.expr.InlineExpressionParser.evaluate(InlineExpressionParser.java:100) ~[shardingsphere-infra-common-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.infra.expr.InlineExpressionParser.splitAndEvaluate(InlineExpressionParser.java:78) ~[shardingsphere-infra-common-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.sharding.rule.ShardingRule.getDataSourceNames(ShardingRule.java:206) ~[shardingsphere-sharding-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.sharding.rule.ShardingRule.lambda$getDataSourceNames$3(ShardingRule.java:195) ~[shardingsphere-sharding-core-5.1.2.jar:5.1.2]
	at java.lang.Iterable.forEach(Iterable.java:75) ~[?:1.8.0_151]
	at org.apache.shardingsphere.sharding.rule.ShardingRule.getDataSourceNames(ShardingRule.java:195) ~[shardingsphere-sharding-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.sharding.rule.ShardingRule.<init>(ShardingRule.java:115) ~[shardingsphere-sharding-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.sharding.rule.builder.ShardingRuleBuilder.build(ShardingRuleBuilder.java:41) ~[shardingsphere-sharding-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.sharding.rule.builder.ShardingRuleBuilder.build(ShardingRuleBuilder.java:35) ~[shardingsphere-sharding-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.infra.rule.builder.schema.DatabaseRulesBuilder.build(DatabaseRulesBuilder.java:56) ~[shardingsphere-infra-common-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase.create(ShardingSphereDatabase.java:73) ~[shardingsphere-infra-common-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.mode.metadata.MetaDataContextsBuilder.getGenericDatabases(MetaDataContextsBuilder.java:79) ~[shardingsphere-mode-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.mode.metadata.MetaDataContextsBuilder.getDatabases(MetaDataContextsBuilder.java:69) ~[shardingsphere-mode-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.mode.metadata.MetaDataContextsBuilder.build(MetaDataContextsBuilder.java:61) ~[shardingsphere-mode-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.mode.manager.memory.MemoryContextManagerBuilder.build(MemoryContextManagerBuilder.java:49) ~[shardingsphere-memory-mode-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.createContextManager(ShardingSphereDataSource.java:85) ~[shardingsphere-jdbc-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.<init>(ShardingSphereDataSource.java:68) ~[shardingsphere-jdbc-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:77) ~[shardingsphere-jdbc-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:92) ~[shardingsphere-jdbc-core-5.1.2.jar:5.1.2]
	at org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:151) ~[shardingsphere-jdbc-core-5.1.2.jar:5.1.2]
	at com.huawei.build.dao.config.DataSourceConfig.compressShardingDataSource(DataSourceConfig.java:120) ~[classes/:?]

已进行操作:

排查到是groovy解析inline表达式时报错导致的,于是我追了一下shardingsphere 的代码,找到了调用groovy解析的地方,把关键方法拿出来写了个main 方法试了一下,也一样报错

    public static void main(String[] args) {
        GroovyShell shell = new GroovyShell();
        String ex = "sharding.build_record${ 0..9 }";
        Script parse = shell.parse(ex);
        int a = 1;
    }

我尝试把表达式改成官方样例里的 ds_${0..1}.t_order_${0..1} 也不行。
问了一下chatGPT,说是groovy 版本不兼容导致的,然后我看了一下本地的groovy版本,是4.0.3,和 shardingsphere 引入的groovy版本是一致的。
对groovy不太熟悉,实在不知道要怎么继续排查了,求指教。

现状:

改成$->{0…9}试试

问题找到了,是因为shardingshphere引入的groovy是 org.apache.groovy:groovy,而我项目里已经引入了 org.codehaus.groovy:groovy,两者有冲突。排除掉 org.apache.groovy:groovy 后问题解决

京ICP备2021015875号