Die Verwendung von Batch Executor wird empfohlen, aber Sie müssen es richtig machen.
Zwei Probleme, die mir aufgefallen sind.
- Es ist wichtig, eine angemessene Stapelgröße festzulegen. Die verlinkte Antwort sendet alle Daten am Ende, was nicht sehr effizient ist.
- Mit
${}
Parameter zu referenzieren macht jede Anweisung einzigartig und hindert den Treiber daran, die Anweisung wiederzuverwenden (der Nutzen des Batch Executors geht im Grunde verloren). Siehe diese FAQ für den Unterschied zwischen#{}
und${}
.
Hier ist eine typische Batch-Operation mit MyBatis.
Als beste batchSize
von verschiedenen Faktoren abhängt, sollten Sie die Leistung anhand der tatsächlichen Daten messen.
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();
}
Und hier ist eine effiziente Version der Update-Anweisung.
<update id="update">
UPDATE <include refid="tableName" />
SET
item_price = #{item.price},
update_time = #{item.updateTime}
WHERE id = #{item.id}
</update>