Att använda batch executor är det rekommenderade sättet, men du måste göra det ordentligt.
Två problem som jag märkte.
- Det är viktigt att ställa in en korrekt batchstorlek. Det länkade svaret skickar all data i slutet, vilket inte är särskilt effektivt.
- Med
${}
till referensparametrar gör varje sats unik och förhindrar föraren från att återanvända satsen (fördelen med batch executor går i princip förlorad). Se denna FAQ för skillnaden mellan#{}
och${}
.
Här är en typisk batchoperation med MyBatis.
Som bästa batchSize
beror på olika faktorer bör du mäta prestandan med hjälp av faktiska 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();
}
Och här är en effektiv version av uppdateringsförklaringen.
<update id="update">
UPDATE <include refid="tableName" />
SET
item_price = #{item.price},
update_time = #{item.updateTime}
WHERE id = #{item.id}
</update>