一個SQL註釋引起的線上問題

最近開始服務拆分,時間將近半個月.測試階段也很是順利,沒有什麼問題.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一部分執行

分享出來,避免你們踩坑,也同時反映了本身的一部分問題,沒有通過測試流程,沒有進行系統的自測,下次須要規範流程,避免產生沒必要要的問題.這雖然是個小問題,但也反映了不少不足.

相關文章
相關標籤/搜索