今天遇到一個略坑的異常:
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進行執行即可