問題のシナリオ
バッチでデータベースにデータを挿入すると、サーバーに多すぎるパラメーターを受信するように求めるメッセージが表示されます。サーバーは最大 2100 個のパラメーターを受信できます。
この時点で、2100 をエンティティ内のフィールドの数で割って、毎回のコミット数を取得します。
- このしきい値を超えない場合は、mapper.xml を通じてバッチに直接挿入できます。
- このしきい値より大きい場合、データをバッチ単位で挿入できます。
Javaコード
int resultInt = 0;
int batchCount = 90; // 每批commit的个数
int batchLastIndex = batchCount;// 每批最后一个的下标
for (int index = 0; index < list.size(); ) {
if (batchLastIndex >= list.size()) {
batchLastIndex = list.size();
resultInt = resultInt * userDao.insertByList(list.subList(index, batchLastIndex));
break;// 数据插入完毕,退出循环
} else {
resultInt = resultInt * userDao.insertByList(list.subList(index, batchLastIndex));
index = batchLastIndex;// 设置下一批下标
batchLastIndex = index + (batchCount - 1);
}
}
Mapper.xml コード
<insert id="insertByList">
insert into user
(Id, Code, TimePoint, MaxValue, MonValue)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.id}, #{item.Code}, #{item.timePoint}, #{item.maxValue}, #{item.monValue})
</foreach>
</insert>
原文からの参照: MyBatis バッチ挿入 SqlServer レポートについて: RPC リクエストで提供されているパラメーターが多すぎます。最大でも 2100 である必要があります。