バッチエグゼキュータを使用することをお勧めしますが、適切に行う必要があります。
私が気付いた2つの問題。
- 適切なバッチサイズを設定することが重要です。 リンクされた回答 最後にすべてのデータを送信しますが、これはあまり効率的ではありません。
-
${}
の使用 パラメータを参照すると、各ステートメントが一意になり、ドライバがステートメントを再利用できなくなります(基本的に、バッチエグゼキュータの利点は失われます)。 このFAQを参照してください。 a>#{}
の違いについて および${}
。
MyBatisを使用した一般的なバッチ操作は次のとおりです。
最適なbatchSize
として さまざまな要因によって異なりますが、実際のデータを使用してパフォーマンスを測定する必要があります。
int batchSize = 1000;
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
YourMapper mapper = sqlSession.getMapper(YourMapper.class);
int size = list.size();
for (int i = 0; i < size;) {
mapper.update(list.get(i));
i++;
if (i % batchSize == 0 || i == size) {
sqlSession.flushStatements();
sqlSession.clearCache();
}
}
sqlSession.commit();
}
そして、これが更新ステートメントの効率的なバージョンです。
<update id="update">
UPDATE <include refid="tableName" />
SET
item_price = #{item.price},
update_time = #{item.updateTime}
WHERE id = #{item.id}
</update>