一、配置
1、背景
一个使用人大金仓数据库的老项目,使用shardingsphere进行分库分表,2024年12月打包可以正常运行,2026年4月打包无法正常运行。
2、Java服务pom.xml文件配置
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.1.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-infra-federation-optimizer</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-infra-common</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-infra-federation-optimizer</artifactId>
<version>5.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-infra-common</artifactId>
<version>5.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>5.1.3</version>
</dependency>
<dependency>
<groupId>cn.com.kingbase</groupId>
<artifactId>kingbase8</artifactId>
<version>9.0.0</version>
</dependency>
3、yml配置
yaml
spring:
datasource:
dynamic:
primary: database1
strict: true
datasource:
database1:
url: jdbc:kingbase8://xxx.xxx.xxx.xxxx:54321/database1?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: xxxxxxxx
password: xxxxx
driver-class-name: com.kingbase8.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle: 5
idle-timeout: 180000
maximum-pool-size: 20
auto-commit: true
pool-name: MyHikariCP
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
shardingsphere:
datasource:
names: database-ggg,database-kkk,database2
database-ggg:
url: jdbc:kingbase8://xxx.xxx.xxx.xxxx:54321/database-ggg?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: xxxxxxxx
password: xxxxx
driver-class-name: com.kingbase8.Driver
type: com.zaxxer.hikari.HikariDataSource
min-pool-size: 5
idle-timeout: 180000
max-pool-size: 200
auto-commit: true
pool-name: MyHikariCP
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
database2:
url: jdbc:kingbase8://xxx.xxx.xxx.xxxx:54321/database1?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: xxxxxxxx
password: xxxxx
driver-class-name: com.kingbase8.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle: 5
idle-timeout: 180000
maximum-pool-size: 20
auto-commit: true
pool-name: MyHikariCP
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
database-kkk:
url: jdbc:kingbase8://xxx.xxx.xxx.xxxx:54321/database-kkk?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: xxxxxxxx
password: xxxxx
driver-class-name: com.kingbase8.Driver
type: com.zaxxer.hikari.HikariDataSource
min-pool-size: 5
idle-timeout: 180000
max-pool-size: 20
auto-commit: true
pool-name: MyHikariCP
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
rules:
sharding:
binding-tables:
- tb_xxx
sharding-algorithms:
tb-rainfall-algorithm:
type: HASH_MOD
props:
sharding-count: '2'
tb-surfacedisplace-algorithm:
type: HASH_MOD
props:
sharding-count: '2'
tables:
#分片规则省略
props:
max-connections-size-per-query: 12
二、问题以及原因分析
shardingsphere5.1.3版本包已经下架,官网无从下载,本地无法打包,切换成其他版本的包,要么启动即报错,要么启动之后,SQL中涉及排序或者分页的SQL无法正常运行。报错日志如下:
powershell
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@29ff3c63] was not registered for synchronization because synchronization is not active
JDBC Connection [org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection@2538621e] will not be managed by Spring
==> Preparing: SELECT id, dhshsh_id, `time`, `value`, `results`, create_time, `status` FROM tb_xxxxx where dhshsh_id= ?
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@29ff3c63]
2026-04-23 09:25:11.113 ERROR 4768 --- [ scheduling-3] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error preparing statement. Cause: org.apache.shardingsphere.sql.parser.exception.SQLParsingException: You have an error in your SQL syntax
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92) ~[mybatis-spring-2.0.5.jar:2.0.5]
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440) ~[mybatis-spring-2.0.5.jar:2.0.5]
at com.sun.proxy.$Proxy157.selectOne(Unknown Source) ~[na:na]
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:159) ~[mybatis-spring-2.0.5.jar:2.0.5]
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:90) ~[mybatis-plus-core-3.4.2.jar:3.4.2]
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148) ~[mybatis-plus-core-3.4.2.jar:3.4.2]
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.4.2.jar:3.4.2]
at com.sun.proxy.$Proxy259.fetchLastData(Unknown Source) ~[na:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_421]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_421]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_421]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_421]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.3.8.jar:5.3.8]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.3.8.jar:5.3.8]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.8.jar:5.3.8]
at com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationInterceptor.invoke(DynamicDataSourceAnnotationInterceptor.java:50) ~[dynamic-datasource-spring-boot-starter-3.5.0.jar:3.5.0]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar:5.3.8]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.8.jar:5.3.8]
at com.sun.proxy.$Proxy260.fetchLastData(Unknown Source) ~[na:na]
at chc.mas.service.impl.SettlementMonitorServiceImpl.fetchLastData(SettlementMonitorServiceImpl.java:72) ~[classes/:na]
at chc.mas.service.impl.SettlementMonitorServiceImpl$$FastClassBySpringCGLIB$$26fada.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.8.jar:5.3.8]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) ~[spring-aop-5.3.8.jar:5.3.8]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.8.jar:5.3.8]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-5.3.8.jar:5.3.8]
at com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationInterceptor.invoke(DynamicDataSourceAnnotationInterceptor.java:50) ~[dynamic-datasource-spring-boot-starter-3.5.0.jar:3.5.0]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.8.jar:5.3.8]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-5.3.8.jar:5.3.8]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) ~[spring-aop-5.3.8.jar:5.3.8]
at chc.mas.service.impl.SettlementMonitorServiceImpl$$EnhancerBySpringCGLIB$$ee59d57b.fetchLastData(<generated>) ~[classes/:na]
at chc.mas.service.impl.BaseMonitorServiceImpl.fetchLastData(BaseMonitorServiceImpl.java:898) ~[classes/:na]
at chc.mas.job.project.UpdateMeasurePointStatus.getByDataPointList(UpdateMeasurePointStatus.java:235) ~[classes/:na]
at chc.mas.job.project.UpdateMeasurePointStatus.updateMeasurePointStatus(UpdateMeasurePointStatus.java:140) ~[classes/:na]
tb_xxxxx 使用了分页,AI分析说,人大数据库在使用分页插件的时候,如果SQL中涉及到数据库关键字,需要使用双引号,而不是`符号。修改后确实有效。
powershell
2026-04-21 11:14:13.432 INFO 1872888 --- [main] chc.mas.MasApplication : The following profiles are active: prod
2026-04-21 11:14:18.941 INFO 1872888 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2026-04-21 11:14:18.945 INFO 1872888 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2026-04-21 11:14:19.028 INFO 1872888 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 65 ms. Found 0 Redis repository interfaces.
2026-04-21 11:14:19.705 ERROR 1872888 --- [main] o.s.boot.SpringApplication : Application run failed
java.lang.NoClassDefFoundError: org/apache/shardingsphere/spi/typed/TypedSPI
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:770)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:520)
at java.net.URLClassLoader.access$300(URLClassLoader.java:75)
at java.net.URLClassLoader$1.run(URLClassLoader.java:400)
at java.net.URLClassLoader$1.run(URLClassLoader.java:383)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:770)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:520)
at java.net.URLClassLoader.access$300(URLClassLoader.java:75)
at java.net.URLClassLoader$1.run(URLClassLoader.java:400)
at java.net.URLClassLoader$1.run(URLClassLoader.java:383)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at org.apache.shardingsphere.sharding.spring.boot.algorithm.ShardingAlgorithmProvidedBeanRegistry.postProcessBeanDefinitionRegistry(ShardingAlgorithmProvidedBeanRegistry.java:38)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:142)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
上面是使用其他版本shardingsphere插件,例如全部改成5.1.1版本。如果全局检索,发现无处使用"org/apache/shardingsphere/spi/typed/TypedSPI"
powershell
### Cause: com.kingbase8.util.KSQLException: 错误: 函数 last_insert_id() 不存在
Hint: 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
Position: 3061 At Line: 3, Line Position: 11
; bad SQL grammar []; nested exception is com.kingbase8.util.KSQLException: 错误: 函数 last_insert_id() 不存在
Hint: 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
Position: 3061 At Line: 3, Line Position: 11
org.springframework.jdbc.BadSqlGrammarException:
### Error updating database. Cause: com.kingbase8.util.KSQLException: 错误: 函数 last_insert_id() 不存在
Hint: 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
Position: 3061 At Line: 3, Line Position: 11
### The error may exist in hshsh/dao/mapper/aggregate/ADDMapper.java (best guess)
### The error may involve hshsh.dao.mapper.aggregate.ADDMapper.insertBatchSomeColumn-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO tb_ADD (XXXXX_id,time,XXX,DDD,results,create_time,type,status,time_str) VALUES (?,?,?,?,?,?,?,?,?) , (?,?,?,?,?,?,?,?,?) , (?,?,?,?,?,?,?,?,?) , (?,?,?,?,?,?,?,?,?)
上面是使用其他版本shardingsphere插件,新增数据的时候报错。
三、解决方案
从日志中会发现大多数报错都涉及到分片表,于是,我解析原始jar包,将原始jar包中的5.1.3版本的shardingsphere上传至本地仓库。使用原始配置。依然各种报错。
为了解决这个问题,我写了一段脚本,分析了原始jar和当前使用原始配置文件的jar,逐一对比所有文件。我发现两个jar引用的kingbase8-9.0.0.jar大小不一致

结合上面日志报错,判断,应该是2026年4月的包和2024年11月的包虽然版本相同,实则内部代码完全不一致。于是我将2024年11月的包kingbase8-9.0.0上传至本地仓库,修改版本号。在代码中重新引入。问题解决。