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

相关推荐
bilI LESS2 小时前
SQL多行数据合并到一行中的一个字段
数据库·sql
m0_588758482 小时前
CSS项目开发如何提速_应用BEM规范建立可复用的样式库
jvm·数据库·python
qq_654366982 小时前
PHP函数是否支持调用FPGA设备_PHP与FPGA硬件交互的实现方式【教程】
jvm·数据库·python
forEverPlume2 小时前
SQL如何在分组查询中包含所有行数据_使用窗口函数OVER PARTITION
jvm·数据库·python
qq_432703662 小时前
CSS如何去掉数字输入框的默认微调按钮_利用---webkit-inner-spin-button
jvm·数据库·python
Irene19912 小时前
Oracle 数据库表操作总结(新建表,删除表,表的增删改查等)
数据库·sql·oracle
weixin_580614002 小时前
HTML怎么创建同步设置精细控制_HTML按模块开关同步项【技巧】
jvm·数据库·python
SelectDB技术团队2 小时前
Apache Doris 4.1:面向 AI & Search 的统一数据存储与检索底座
数据库·数据仓库·实时分析·selectdb
maqr_1102 小时前
Golang怎么对接ChatGPT_Golang ChatGPT教程【简明】
jvm·数据库·python