最近开始服务拆分,时间将近半个月.测试阶段也很是顺利,没有什么问题.java
但上线以后的次日,产品就风风火火的来找咱们了,一看就是线上有什么问题.咱们也不敢说,咱们也不敢问,线上的后台商品突然没法上架了,致使运营的同窗删除商品后没法上架新的商品,致使APP的部分商品暂时不可见.spring
线上有问题,那么你们就开始迅速排查起来了.这里有一点要说一下,在上线前夕,产品临时添加一个新的需求,商品的搜索状态不可判断这个条件去掉,这个因为紧急并且对于咱们来讲也就是SQL中的一个条件的问题,也就没有通过测试,直接上线了,主要也是想省点事情,遇上顺风车直接上线,可问题就出在这里!sql
贴上部分相似逻辑SQL片断app
select
count(1) from
product where
code = #{code}
and search =#{search}
and kskdsk=#{kskdsk}
此刻产品需求就是search这个条件去掉,那就习惯性的用IDEA快捷键CTRL+/ 来了一个and条件注释测试
select count(1) from product where code = #{code}
# and search =#{search} and kskdsk=#{kskdsk}
而后IDEA就很乖巧的给我注释..注释了...,显示状态也是灰色的显示,应该没什么问题了.spa
通过紧急的五分钟排查日志,看到了这个异常日志
org.springframework.dao.TransientDataAccessResourceException: ### Error querying database. Cause: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2). ### The error may exist in file [/***/***/***Mapper.xml] ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: select count(1) from product where code = ? # and search=? and kskdsk=?
毫无疑问,问题确定是这个SQL致使的问题,我一看,天哪,注释的语句怎么跑到预编译的SQL中了!不是应该忽略吗?很明显,不是预想的那样.首先错误的意思大概就是,个人SQL中只须要两个参数,我传了三个参数进去,有一个参数找不到他的坑位,其次就是这个#号注释致使的问题,没有被忽略,虽然咱们在Navicat for MySql中能够用#号,可是预编译不行,他会把注释给编译到SQl中,除非用<!---->这种注释才能够.code
这个注释致使xml
一.参数个数不一致,致使多传的参数不知道放在哪里blog
二.注释在预编译语句仍是当成SQL一部分执行
分享出来,避免你们踩坑,也同时反映了本身的一部分问题,没有通过测试流程,没有进行系统的自测,下次须要规范流程,避免产生没必要要的问题.这虽然是个小问题,但也反映了不少不足.