sql >> Database teknologi >  >> RDS >> Oracle

Hurtigste måde at opdatere et stort antal rækker med input param List i MyBatis til Oracle db

Brug af batch executor er den anbefalede måde, men du skal gøre det ordentligt.
To problemer, som jeg har bemærket.

  1. Det er vigtigt at indstille en korrekt batchstørrelse. Det linkede svar sender alle data til sidst, hvilket ikke er særlig effektivt.
  2. Brug af ${} at referere parametre gør hver sætning unik og forhindrer driveren i at genbruge sætningen (fordelen ved batch executor går dybest set tabt). Se dette ofte stillede spørgsmål for forskellen mellem #{} og ${} .

Her er en typisk batch-handling ved hjælp af MyBatis.
Som den bedste batchSize afhænger af forskellige faktorer, bør du måle ydeevnen ved hjælp af de faktiske 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();
}

Og her er en effektiv version af opdateringserklæringen.

<update id="update">
  UPDATE <include refid="tableName" />
  SET
    item_price = #{item.price},
    update_time = #{item.updateTime}
  WHERE id = #{item.id}
</update>



  1. Oracle- Split streng kommasepareret (streng indeholder mellemrum og på hinanden følgende kommaer)

  2. Hvordan kan jeg gøre denne geo-distance SQL-forespørgsel Postgres-kompatibel

  3. Sådan tilføjes en DEFAULT-begrænsning til en eksisterende kolonne i SQL Server

  4. Hvordan kan jeg slette dublerede rækker i en tabel