Bootstrap

批量插入数据出现“该服务器支持最多 2100 个参数。请减少参数的数目,然后重新发送该请求”。

需求分析:一次性需要插入多条数据时,我们都会想到用批量插入的方式以减少对数据库的访问次数。

情景再现: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 存放单次待插入的数据集合

;