Sử dụng trình thực thi hàng loạt là cách được khuyến nghị, nhưng bạn cần thực hiện đúng cách.
Hai vấn đề mà tôi nhận thấy.
- Đặt kích thước lô thích hợp là rất quan trọng. câu trả lời được liên kết gửi tất cả dữ liệu vào cuối mà không hiệu quả lắm.
- Sử dụng
${}
tham số tham chiếu làm cho mỗi câu lệnh trở thành duy nhất và ngăn trình điều khiển sử dụng lại câu lệnh (về cơ bản, lợi ích của trình thực thi hàng loạt bị mất). Xem Câu hỏi thường gặp này để biết sự khác biệt giữa#{}
và${}
.
Đây là hoạt động hàng loạt điển hình sử dụng MyBatis.
Là batchSize
tốt nhất phụ thuộc vào các yếu tố khác nhau, bạn nên đo lường hiệu suất bằng cách sử dụng dữ liệu thực tế.
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();
}
Và đây là phiên bản hiệu quả của tuyên bố cập nhật.
<update id="update">
UPDATE <include refid="tableName" />
SET
item_price = #{item.price},
update_time = #{item.updateTime}
WHERE id = #{item.id}
</update>