MySQLSyntaxErrorException: Query was empty解决思路

本文分享了一次线上环境遇到的“Querywasempty”错误排查经历,通过对比测试与线上环境的properties文件,最终定位到自定义DAO层中缓存SQL结构的配置差异,解决了由环境配置不同引发的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近的一个项目,本地环境启动正常,上到线上就报错:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Query was empty
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.Util.getInstance(Util.java:408)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3970)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3906)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)

 使用的Mabatis框架,自定义了一部分DAO层,报这个错是因为执行SQL的时候传过去一个空字符串。

下面是解题心路历程:

首先,由于环境不一样导致的错误一定是环境问题。由于线上和测试使用不同的properties文件,我逐个对比里面的属性,没有缺少的。

继续看日志,找到报错的那一行(由于涉及到公司的类,就不贴了,日志都有打印的),在往里面找代码,发现就是封装的dao层了,这里用到最笨的方法,把jar里面相关的类粘出来,写上日志,一点点排查。

最后发现,项目自己封装的jar里面有自动拼装SQL的机制,在拼装之前先缓存了SQL的结构,然后需要的时候,根据表名查找结构,但是缓存SQL的机制有个配置,就是测试环境和线上环境不一致的地方。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值