sql >> Database >  >> RDS >> Oracle

Snelste manier om een ​​groot aantal rijen bij te werken met invoerparameter Lijst in MyBatis naar Oracle db

Het gebruik van batch-executor is de aanbevolen manier, maar je moet het op de juiste manier doen.
Twee problemen die ik heb opgemerkt.

  1. Het is belangrijk om een ​​juiste batchgrootte in te stellen. Het gekoppelde antwoord stuurt alle gegevens aan het einde, wat niet erg efficiënt is.
  2. Met ${} het verwijzen naar parameters maakt elke instructie uniek en voorkomt dat het stuurprogramma de instructie opnieuw gebruikt (het voordeel van batch-uitvoerder gaat in feite verloren). Zie deze FAQ voor het verschil tussen #{} en ${} .

Hier is een typische batchbewerking met MyBatis.
Als de beste batchSize afhankelijk is van verschillende factoren, moet u de prestaties meten aan de hand van de werkelijke gegevens.

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();
}

En hier is een efficiënte versie van de updateverklaring.

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



  1. org.hibernate.HibernateException:opslaan is niet geldig zonder actieve transactie

  2. miljoen tabel maken in een database?

  3. Hoe selecteer ik TOP 5 PERCENT van elke groep?

  4. DE clausule GEBRUIKEN in orakel 11g