注册

DmJdbcDriver11+JPA+达梦Hibernate方言首次执行where ? is null 这类的sql报 Communication error错误,驱动or达梦方言bug?

DM_102312 2026/01/14 540 0

基础环境

操作系统:window 10

达梦数据库版本:dm8_20251020_x86_win_64

CPU:x86

问题描述

程序基础信息

SpringBoot:3.2.4

JDK:17

DmJdbcDriver11:8.1.4.41033

DmDialect-for-hibernate6.6:8.1.4.93

初始化sql

CREATE SCHEMA "public"; CREATE TABLE "public"."user" ( "id" BIGINT NOT NULL, "name" VARCHAR(100) NULL, "email" VARCHAR(100) NULL, "age" NUMERIC NULL, CONSTRAINT "user_pk" PRIMARY KEY ("id") ); INSERT INTO "public"."user" ("id", "name", "email", "age") VALUES(1, '张三', 'zhangsan@test.com', 18); INSERT INTO "public"."user" ("id", "name", "email", "age") VALUES(2, '李四', 'lisi@test.com', 19); INSERT INTO "public"."user" ("id", "name", "email", "age") VALUES(3, '王五', 'wangwu@test.com', 20);

实例代码:
dameng-springboot.zip

问题复现

基于以上的版本信息,在本地模拟一个通过关键字查询的接口,实现的内容为:当检索字段为空时搜索全部内容,当检索字段不为空时,进行模糊搜索。

controller:

@GetMapping("/search") public List<User> search(@RequestParam(required = false) String textSearch) { return userRepository.findUserByKeyWord(textSearch); } @GetMapping("/search2") public List<User> search2(@RequestParam(required = false) String textSearch) { return userRepository.findUserByKeyWord2(textSearch); }

dao为:

@Query("SELECT t FROM User t WHERE (:textSearch IS NULL OR (UPPER(t.name) LIKE UPPER(CONCAT('%', :textSearch, '%')))) ") List<User> findUserByKeyWord(@Param("textSearch") String textSearch); @Query("SELECT t FROM User t WHERE (:textSearch IS NULL ) ") List<User> findUserByKeyWord2(@Param("textSearch") String textSearch);

启动程序,第一次调用http://localhost:8080/api/user/search 搜索字段为空,失败,报错如下错误,通信异常:

2026-01-14T10:54:07.374+08:00 ERROR 14084 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.DataAccessResourceFailureException: JDBC exception executing SQL [select u1_0."id",u1_0."age",u1_0."email",u1_0."name" from "user" u1_0 where (? is null or (upper(u1_0."name") like upper(('%'||?||'%'))))] [Communication error] [n/a]] with root cause

java.io.EOFException: null
	at dm.jdbc.util.buffer.ByteArrayNode.load(SourceFile:132) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.util.buffer.Buffer.load(SourceFile:365) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.c.a(SourceFile:208) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.a.e(SourceFile:399) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.a.a(SourceFile:273) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.a.a(SourceFile:1250) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.a.b(SourceFile:1077) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.a.a(SourceFile:861) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]

在DM管理工具执行生成的sql是可以正常执行并返回数据的。

image20260114105656435.png

第二次调用http://localhost:8080/api/user/search2 搜索字段为空,也失败,报错如下:

2026-01-14T10:55:00.628+08:00 ERROR 14084 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.DataAccessResourceFailureException: JDBC exception executing SQL [select u1_0."id",u1_0."age",u1_0."email",u1_0."name" from "user" u1_0 where (? is null)] [Communication error] [n/a]] with root cause

java.io.EOFException: null
	at dm.jdbc.util.buffer.ByteArrayNode.load(SourceFile:132) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.util.buffer.Buffer.load(SourceFile:365) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.c.a(SourceFile:208) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.a.e(SourceFile:399) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.a.a(SourceFile:273) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.a.a(SourceFile:1250) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.a.b(SourceFile:1077) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]
	at dm.jdbc.a.a.a(SourceFile:861) ~[DmJdbcDriver11-8.1.4.41033.jar:- 8.1.4.181 - Production]

在DM管理工具执行生成的sql是可以正常执行并返回数据的。

image20260114105744216.png

在程序启动之间,本地的达梦实例看着是正常的,没有中断或者存在网络问题,可访问http://localhost:8080/api/user进行测试。
image20260114110221218.png

第三次调用,这次搜索字段不为空,如http://localhost:8080/api/user/search?textSearch=张三

image20260114110520806.png

这个时候程序就正常了。

接着进行第四次调用,搜索字段还是为空 如,http://localhost:8080/api/user/search,也是正常

image20260114110647454.png

调用http://localhost:8080/api/user/search2 依旧报刚刚的通信异常错误。

结论:只有当搜索字段不为空时进行一次搜索后,后面的查询该接口不管参数是否为空,都可以进行搜索,也没有报错。

重新启动程序,调用刚刚已经正常的search接口,也是没问题的,但是当我重启达梦数据库实例后,再次启动我的程序,这个问题就又出现了。

image20260114111222423.png

请问这个是怎么回事?是我当前使用的达梦jdbc驱动有问题吗还是达梦的hibernate方言问题呢?对首次 ? is null这类sql解析有异常?达梦数据库实例也有对应的缓存?这类错误该怎么解决呢?麻烦帮忙看看,非常感谢。

补充一个完整日志:
log.txt

回答 0
暂无回答
扫一扫
联系客服