Brug af batch executor er den anbefalede måde, men du skal gøre det ordentligt.
To problemer, som jeg har bemærket.
- Det er vigtigt at indstille en korrekt batchstørrelse. Det linkede svar sender alle data til sidst, hvilket ikke er særlig effektivt.
- Brug af
${}
at referere parametre gør hver sætning unik og forhindrer driveren i at genbruge sætningen (fordelen ved batch executor går dybest set tabt). Se dette ofte stillede spørgsmål for forskellen mellem#{}
og${}
.
Her er en typisk batch-handling ved hjælp af MyBatis.
Som den bedste batchSize
afhænger af forskellige faktorer, bør du måle ydeevnen ved hjælp af de faktiske data.
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();
}
Og her er en effektiv version af opdateringserklæringen.
<update id="update">
UPDATE <include refid="tableName" />
SET
item_price = #{item.price},
update_time = #{item.updateTime}
WHERE id = #{item.id}
</update>