PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Qual è il modo più efficiente per mantenere migliaia di entità?

Devi usare gli inserti batch.

  1. Crea un'interfaccia per un repository personalizzato SomeRepositoryCustom
public interface SomeRepositoryCustom {

    void batchSave(List<Record> records);

}
  1. Crea un'implementazione di 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. Estendi il tuo JpaRepository con SomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {

}

per salvare

someRepository.batchSave(records);

Note

Tieni presente che, anche se stai utilizzando inserimenti batch, il driver del database non li utilizzerà. Ad esempio, per MySQL è necessario aggiungere un parametro rewriteBatchedStatements=true all'URL del database. Quindi è meglio abilitare la registrazione SQL del driver (non Hibernate) per verificare tutto. Può anche essere utile per eseguire il debug del codice del driver.

Dovrai prendere una decisione sulla divisione dei record per pacchetti nel loop

    for (Record record : records) { 

    }

Un autista può farlo per te, quindi non ne avrai bisogno. Ma è meglio eseguire il debug anche di questa cosa.

P.S. Non usare var ovunque.