Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Der schnellste Weg, um eine große Anzahl von Zeilen mit dem Eingabeparameter List in MyBatis auf Oracle db zu aktualisieren

Die Verwendung von Batch Executor wird empfohlen, aber Sie müssen es richtig machen.
Zwei Probleme, die mir aufgefallen sind.

  1. Es ist wichtig, eine angemessene Stapelgröße festzulegen. Die verlinkte Antwort sendet alle Daten am Ende, was nicht sehr effizient ist.
  2. 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>