一.问题说明
springboot的项目,多数据源,其中一个数据源是达梦数据库。有个根据主键id查询详情的接口,一直报错网络通信异常,或连接尚未建立或者已经关闭。可以确保访问数据库的网络一切正常,单单一张表的接口一直报上述异常。
二.解决
一直以为是数据库或后台程序数据源配置问题,最后通过达梦jdbc日志,发现sql的param是setNull,也就是sql没有获得到id这个参数,前端传参格式有误,后台接收不到,但是达梦报错却是网络异常。
解决过程中的尝试:JAVA | 达梦技术文档
根据达梦官方文档,一条条查询是否有问题。最后发现都没有问题,于是就开启JDBC日志,查看sql异常详情。
达梦开启JDBC日志:
#springboot数据源配置,加上logLevel、logDir
eg:jdbc:dm://127.0.0.1:5236?logLevel=all&logDir=/home/damengLog
logLevel 表示日志级别,日志按从低到高依次如下:off:不记录
error:只记录错误日志
warn:记录警告信息
sql:记录 sql 执行信息
info:记录全部执行信息
all:记录全部
高级别同时记录低级别的信息。logDir 表示存放 JDBC 日志的路径,可以是相对路径也可以是绝对路径。
在JDBC日志中发现查询表的sql,id设值不正常是setnull,查询前端传参后,发现参数都是json字符串,而后台是对象接收的,导致id是null。发现问题原因就好处理了,将前端改好后,打包发布下就正常了。由于达梦异常提示“网络通信异常”,就没想过前端传参有问题,误认为是数据库或是数据源配置问题。
总结
这里就想吐槽下,达梦的异常是真的让人不知所云,还有表字段长度不够,提示的是“dm.jdbc.driver.DMException: 字符串截断”,难道就不能直接日志输出哪个字段不够长。希望国产数据库优化下使用体验,达梦管理工具也是难用的一比,过滤查询不人性化,数据导出也不好用。连接数据库还是得用dataGrip ,至少查询导出方便且效率高。