在做批量插入的时候
难免会遇到例如list的数目过多,导致一次性批量插入的参数超过限定数量
此时就会报错:microsoft.sqlserver.jdbc.SQLServerException: 传入的请求具有过多的参数。该服务器支持最多 2100 个参数。请减少参数的数目,然后重新发送该请求。<EOL>; uncategorized SQLException; SQL state [S0001]; error code [8003]; 传入的请求具有过多的参数。该服务器支持最多 2100 个参数。请减少参数的数目,然后重新发送该请求。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 传入的请求具有过多的参数。该服务器支持最多 2100 个参数。请减少参数的数目,然后重新发送该请求。
此时最简单的思路就是把list分段进行批量插入:
现在提供一个现成的代码,直接copy可用:
//获取list List<ProductionOrd> list = eaMapper.getProductionOrder(); int batchSize = 1000; // 每批次插入的数据量 if (list != null && list.size() > 0) { for (int i = 0; i < list.size(); i += batchSize) { int toIndex = Math.min(i + batchSize, list.size()); List<ProductionOrd> subList = list.subList(i, toIndex); mxProductionOrdMapper.batchInsert(subList); } }
引入了一个 batchSize
变量来表示每批次插入的数据量。然后使用循环和 subList
方法将原始列表拆分成多个小列表,每个小列表包含最多 batchSize
条数据,然后逐个插入到数据库中。
这样做可以确保每次插入的参数数量不会超出数据库的限制,从而解决报错问题。
注意的是不要超过参数的阈值.
阈值除以你数据库插入一个的参数值的和值就是你能插入的最大数量的list集合数量.