• 关于数据库操作参数过多的异常


    今天遇到一个略坑的异常:

    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进行执行即可

  • 相关阅读:
    大学毕业4年-回顾和总结(1)-钱,金钱观
    VR开发中性能问题—OculusWaitForGPU
    动态规划(一)
    POJ 2229 Sumsets
    hihoCoder #1122 : 二分图二•二分图最大匹配之匈牙利算法
    hihoCoder #1127 : 二分图二·二分图最小点覆盖和最大独立集
    hihoCoder #1121 : 二分图一•二分图判定
    HDU 1978 How many ways
    POJ1579 Function Run Fun
    POJ 2081 Recaman's Sequence
  • 原文地址:https://www.cnblogs.com/s1165482267/p/9079202.html
Copyright © 2020-2023  润新知