1. 程式人生 > >記一次idea環境導致的資料庫報錯

記一次idea環境導致的資料庫報錯

1. 問題

下午測試一個get介面時,mybatis一直報錯,有如下兩個異常資訊:

  • MyBatisSystemException with kryo’s ClassLoader. Retrying with current
  • Expected one result to be returned by selectone(),but found 344

本身入參是一個id,查出來的資料應該是一個,但是此時提示查出表中所有的資料,所以報異常了。

2. 程式碼業務

  • 資料庫語句,so easy
       @Override
        public AccessPolicyAnalysisResult get(AccessPolicyAnalysisResult model) throws ServiceException {
            return super.get(model);
        }
  • mybatis對應的xml語句
<select id="get" resultType="AccessPolicyAnalysisResult">
        <include refid="access_policy_analysis_mapping_column"/>
        <where>
            <if test="globalId != null ">
                and global_id = #{globalId}
            </if>
            <if test="applyId != null ">
                and apply_id = #{applyId}
            </if>
        </where>
        limit 1
    </select>

3. 定位思路

  1. 首先當然是檢查程式碼,但是未發現異常;
  2. 手動執行sql語句,可以正常查出一條資料;
  3. 因為公司的框架,log設定成debug,就可以列印sql語句了。所以修改成debug,發現什麼log都沒有,正常的業務log也沒有。此時感覺可能和環境有關。
  4. 重啟idea,專案沒有自動載入,然後手動匯入專案,配置maven、jdk,再次啟動tomcat,問題解決。

4. 問題原因

我在除錯這個介面之前,修改了一下mapper.xml配置檔案,因為我的入參是applyId不是主鍵,所以我添加了上面sql語句中的如下內容:

 <if test="applyId != null ">
      and apply_id = #{applyId}
 </if>

增加這個判斷之後,並沒有重新編譯專案,直接啟動tomcat,導致tomcat並沒有載入到變更。此時通過applyId查詢不到特定的那條資料,故出現以上異常。

5. 問題總結

問題不復雜,但是耽誤了一些時間;教訓就是,遇到問題要多思考,尤其是這種感覺程式碼沒有問題的時候,可以想想外觀因素。不能盲目的一直定位程式碼問題。