PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Was ist der effizienteste Weg, um Tausende von Entitäten beizubehalten?

Sie müssen Stapeleinfügungen verwenden.

  1. Erstellen Sie eine Schnittstelle für ein benutzerdefiniertes Repository SomeRepositoryCustom
public interface SomeRepositoryCustom {

    void batchSave(List<Record> records);

}
  1. Erstellen Sie eine Implementierung von 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. Erweitern Sie Ihr JpaRepository mit SomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {

}

zu speichern

someRepository.batchSave(records);

Notizen

Denken Sie daran, dass der Datenbanktreiber diese nicht verwendet, selbst wenn Sie Stapeleinfügungen verwenden. Beispielsweise muss für MySQL der Parameter rewriteBatchedStatements=true hinzugefügt werden zur Datenbank-URL. Es ist also besser, die Treiber-SQL-Protokollierung (nicht Hibernate) zu aktivieren, um alles zu überprüfen. Kann auch nützlich sein, um Treibercode zu debuggen.

Sie müssen eine Entscheidung über das Aufteilen von Datensätzen nach Paketen in der Schleife treffen

    for (Record record : records) { 

    }

Ein Fahrer kann das für Sie erledigen, Sie brauchen ihn also nicht. Aber es ist besser, dieses Ding auch zu debuggen.

P. S. Verwenden Sie nicht var überall.