人大金仓kingbase8和shardingsphere兼容性问题

一、配置

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上传至本地仓库,修改版本号。在代码中重新引入。问题解决。

相关推荐
Mahir087 小时前
Redis 与 MySQL 数据同步:一致性保证的完整解决方案
数据库·redis·mysql·缓存·面试·数据一致性
2301_769340677 小时前
如何在 Vuetify 中可靠捕获 Chip 关闭事件(包括键盘触发).txt
jvm·数据库·python
AC赳赳老秦7 小时前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
灵犀学长8 小时前
基于 Spring ThreadPoolTaskScheduler + CronTrigger 实现的动态定时任务调度系统
java·数据库·spring
北秋,8 小时前
PostgreSQL(Postgres)数据库基础用法 + 数字型 + 字符型 完整联合注入实战
数据库·postgresql·开源
m0_596749099 小时前
JavaScript中手动实现一个new操作符的底层逻辑
jvm·数据库·python
多加点辣也没关系9 小时前
Redis 的安装(详细教程)
数据库·redis·缓存
数据库小学妹10 小时前
数据库连接池避坑指南:告别“连接超时”与“资源耗尽”,让系统跑得更快!
数据库·redis·sql·mysql·缓存·dba
dishugj10 小时前
HANA 数据库备份与恢复
数据库·oracle
前进的李工10 小时前
EXPLAIN输出格式全解析:JSON、TREE与可视化
开发语言·数据库·mysql·性能优化·explain