Het gebruik van batch-executor is de aanbevolen manier, maar je moet het op de juiste manier doen.
Twee problemen die ik heb opgemerkt.
- Het is belangrijk om een juiste batchgrootte in te stellen. Het gekoppelde antwoord stuurt alle gegevens aan het einde, wat niet erg efficiënt is.
- Met
${}
het verwijzen naar parameters maakt elke instructie uniek en voorkomt dat het stuurprogramma de instructie opnieuw gebruikt (het voordeel van batch-uitvoerder gaat in feite verloren). Zie deze FAQ voor het verschil tussen#{}
en${}
.
Hier is een typische batchbewerking met MyBatis.
Als de beste batchSize
afhankelijk is van verschillende factoren, moet u de prestaties meten aan de hand van de werkelijke gegevens.
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();
}
En hier is een efficiënte versie van de updateverklaring.
<update id="update">
UPDATE <include refid="tableName" />
SET
item_price = #{item.price},
update_time = #{item.updateTime}
WHERE id = #{item.id}
</update>