關於數據庫操作參數過多的異常


今天遇到一個略坑的異常:

com.microsoft.sqlserver.jdbc.SQLServerException: 傳入的請求具有過多的參數。該服務器支持最多 2100 個參數。請減少參數的數目,然后重新發送該請求。

看到這個異常第一個反應就是改MyBatis或SqlServer的配置,后經百度,只找到了原因:

https://blog.csdn.net/syy_c_j/article/details/52151402

  • SqlServer 對語句的條數和參數的數量都有限制,分別是 1000 和 2100。
  • Mysql 對語句的長度有限制,默認是 4M。
  • Mybatis 對動態語句沒有數量上的限制

 

無果,只能自己debug看看是哪句sql的參數過多:因為session是openSession(ExecutorType.BATCH)的批處理執行,所以先將openSession的參數改為true(自動提交)

在一句批量插入的操作中拋出這個異常,查看sql發現用了foreach

 1 <!-- 批量插入問題件 -->
 2 <sql id="sqlInsertQuestions">
 3     <foreach collection="questionList" item="question">
 4         insert into cmd_Question (
 5     qu_clm_id,qu_data_id,qu_code,qu_des,qu_fieldcode,qu_data_type
 6         ) values(
 7             #{clm_id},#{question.qu_data_id},#{question.qu_code},#{question.qu_des},#{question.qu_fieldcode},#{question.qu_data_type}
 8         )
 9     </foreach>
10 </sql>

之后經過嘗試,只需將sql中的for循環提出至代碼中進行循環即可,即

1 for (Question question : claim.getQuestionList()) {
2     mapper.insertQuestion(question);
3 }
1 <insert id="insertQuestion" parameterType="question">
2     insert into cmd_Question (
3         qu_clm_id,qu_data_id,qu_code,qu_des,qu_fieldcode,qu_data_type
4     ) values(
5         #{qu_clm_id},#{qu_data_id},#{qu_code},#{qu_des},#{qu_fieldcode},#{qu_data_type}
6     )
7 </insert>

將一句sql中執行N次插入換成N條sql進行執行即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM