操作系统: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是可以正常执行并返回数据的。
第二次调用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是可以正常执行并返回数据的。
在程序启动之间,本地的达梦实例看着是正常的,没有中断或者存在网络问题,可访问http://localhost:8080/api/user进行测试。
第三次调用,这次搜索字段不为空,如http://localhost:8080/api/user/search?textSearch=张三
这个时候程序就正常了。
接着进行第四次调用,搜索字段还是为空 如,http://localhost:8080/api/user/search,也是正常
调用http://localhost:8080/api/user/search2 依旧报刚刚的通信异常错误。
结论:只有当搜索字段不为空时进行一次搜索后,后面的查询该接口不管参数是否为空,都可以进行搜索,也没有报错。
重新启动程序,调用刚刚已经正常的search接口,也是没问题的,但是当我重启达梦数据库实例后,再次启动我的程序,这个问题就又出现了。
请问这个是怎么回事?是我当前使用的达梦jdbc驱动有问题吗还是达梦的hibernate方言问题呢?对首次 ? is null这类sql解析有异常?达梦数据库实例也有对应的缓存?这类错误该怎么解决呢?麻烦帮忙看看,非常感谢。
补充一个完整日志:
log.txt
