MySQLSyntaxErrorException: Query was empty解决思路

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

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的机制有个配置,就是测试环境和线上环境不一致的地方。

发布了57 篇原创文章 · 获赞 39 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/SJZYLC/article/details/93621820