Menggunakan eksekutor batch adalah cara yang disarankan, tetapi Anda harus melakukannya dengan benar.
Dua masalah yang saya perhatikan.
- Menyetel ukuran batch yang tepat adalah penting. jawaban tertaut mengirimkan semua data pada akhirnya yang sangat tidak efisien.
- Menggunakan
${}
ke parameter referensi membuat setiap pernyataan unik dan mencegah pengemudi menggunakan kembali pernyataan tersebut (pada dasarnya manfaat dari pelaksana batch hilang). Lihat FAQ ini untuk perbedaan antara#{}
dan${}
.
Berikut ini adalah operasi batch yang umum menggunakan MyBatis.
Sebagai batchSize
terbaik tergantung pada berbagai faktor, Anda harus mengukur kinerja menggunakan data aktual.
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();
}
Dan ini adalah versi pernyataan pembaruan yang efisien.
<update id="update">
UPDATE <include refid="tableName" />
SET
item_price = #{item.price},
update_time = #{item.updateTime}
WHERE id = #{item.id}
</update>