sql >> Databasteknik >  >> RDS >> PostgreSQL

Vilket är det mest effektiva sättet att bevara tusentals enheter?

Du måste använda batch-inlägg.

  1. Skapa ett gränssnitt för ett anpassat arkiv SomeRepositoryCustom
public interface SomeRepositoryCustom {

    void batchSave(List<Record> records);

}
  1. Skapa en implementering av SomeRepositoryCustom
@Repository
class SomesRepositoryCustomImpl implements SomeRepositoryCustom {

    private JdbcTemplate template;

    @Autowired
    public SomesRepositoryCustomImpl(JdbcTemplate template) {
        this.template = template;
    }

    @Override
    public void batchSave(List<Record> records) {
        final String sql = "INSERT INTO RECORDS(column_a, column_b) VALUES (?, ?)";

        template.execute(sql, (PreparedStatementCallback<Void>) ps -> {
            for (Record record : records) {
                ps.setString(1, record.getA());
                ps.setString(2, record.getB());
                ps.addBatch();
            }
            ps.executeBatch();
            return null;
        });
    }

}
  1. Utöka ditt JpaRepository med SomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {

}

för att spara

someRepository.batchSave(records);

Anteckningar

Tänk på att om du ens använder batch-inlägg kommer inte databasdrivrutinen att använda dem. Till exempel, för MySQL, är det nödvändigt att lägga till en parameter rewriteBatchedStatements=true till databasen URL. Så bättre att aktivera föraren SQL-loggning (inte Hibernate) för att verifiera allt. Kan också vara användbart för att felsöka drivrutinskod.

Du måste fatta beslut om att dela upp poster efter paket i loopen

    for (Record record : records) { 

    }

En förare kan göra det åt dig, så du behöver det inte. Men det är bättre att felsöka den här saken också.

P. S. Använd inte var överallt.




  1. återkommande faktureringssystem

  2. Hur tar jag reda på om en oracle-databas är inställd på autocommit?

  3. Varför tar frågor som körs från mysql workbench mycket längre tid än att köra dem direkt från mysql cli?

  4. Spring JDBC - Senast infogade id