Oracle
 sql >> Base de données >  >> RDS >> Oracle

Le moyen le plus rapide de mettre à jour un grand nombre de lignes avec le paramètre d'entrée List dans MyBatis vers Oracle db

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.

  1. 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.
  2. 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>