L'utilisation de l'exécuteur par lots est la méthode recommandée, mais vous devez le faire correctement.
Deux problèmes que j'ai remarqués.
- Il est important de définir une taille de lot appropriée. La réponse liée envoie toutes les données à la fin, ce qui n'est pas très efficace.
- En utilisant
${}
aux paramètres de référence rend chaque instruction unique et empêche le pilote de réutiliser l'instruction (le bénéfice de l'exécuteur de lots est perdu, en gros). Voir cette FAQ pour la différence entre#{}
et${}
.
Voici une opération batch typique utilisant MyBatis.
Comme le meilleur batchSize
dépend de divers facteurs, vous devez mesurer les performances à l'aide des données réelles.
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();
}
Et voici une version efficace de la déclaration de mise à jour.
<update id="update">
UPDATE <include refid="tableName" />
SET
item_price = #{item.price},
update_time = #{item.updateTime}
WHERE id = #{item.id}
</update>