需求分析:一次性需要插入多条数据时,我们都会想到用批量插入的方式以减少对数据库的访问次数。
情景再现:Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 传入的请求具有过多的参数。该服务器支持最多 2100 个参数。请减少参数的数目,然后重新发送该请求。
问题分析:报错提示很明显,一次性插入的字段数量超过了 SQLServer 设定的阈值,默认最多传递2100 个参数。
解决方案:将存放全部数据的集合拆分成多个小集合进行批量上传。定义一个变量存放每次插入到数据库中的数据量。
那么每次拆分多少数据量呢?这取决于你插入的字段的个数和。
每次批量插入的数据量 = 数据库设定的阈值 / 一条记录插入的参数个数和
例如一条数据需要插入10个字段信息,那么每次批量插入的数据量 = 2100 / 10 , 也就是说每次批量插入最多能插入210条数据。
// 批量上传批量数据,避免超过sqlserver最大参数个数限定
int bunchSize = 290; // 每次插入的数据量 = 数据库阈值 / 一条记录插入的参数个数和
if (sapInfoList != null && sapInfoList.size() > 0) {
for (int i = 0; i < sapInfoList.size(); i+= bunchSize) {
// 定位每次结束的下标位置
int end_dex = Math.min(i + bunchSize, sapInfoList.size());
// 将存放整体数据的集合分隔成多个小集合进行批量上传数据, 防止最后一次下标越界
List<SapSelect> sapInfoSubList = sapInfoList.subList(i, end_dex);
this.sapParamMapper.insertBunch(sapInfoSubList);
}
}
上述代码解读:
bunchSize 表示每次批量插入的数据量
sapInfoList 存放全部待插入的数据集合
sapInfoSubList 存放单次待插入的数据集合