Използването на пакетен изпълнител е препоръчителният начин, но трябва да го направите правилно.
Два проблема, които забелязах.
- Задаването на подходящ размер на партидата е важно. свързаният отговор изпраща всички данни в края, което не е много ефективно.
- Използване на
${}
за препращане към параметри прави всеки оператор уникален и не позволява на драйвера да използва повторно израза (ползбата от груповия изпълнител се губи, основно). Вижте този ЧЗВ за разликата между#{}
и${}
.
Ето типична групова операция с помощта на 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>