最近開始服務拆分,時間將近半個月.測試階段也很是順利,沒有什麼問題.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一部分執行
分享出來,避免你們踩坑,也同時反映了本身的一部分問題,沒有通過測試流程,沒有進行系統的自測,下次須要規範流程,避免產生沒必要要的問題.這雖然是個小問題,但也反映了不少不足.