sql >> Databáze >  >> RDS >> PostgreSQL

Jaký je nejúčinnější způsob, jak přetrvat tisíce subjektů?

Musíte použít dávkové přílohy.

  1. Vytvořte rozhraní pro vlastní úložiště SomeRepositoryCustom
public interface SomeRepositoryCustom {

    void batchSave(List<Record> records);

}
  1. Vytvořte implementaci 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. Rozšiřte svůj JpaRepository s SomeRepositoryCustom
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {

}

uložit

someRepository.batchSave(records);

Poznámky

Mějte na paměti, že pokud dokonce používáte dávkové vkládání, databázový ovladač je nepoužije. Například pro MySQL je nutné přidat parametr rewriteBatchedStatements=true do databáze URL.Takže je lepší povolit řidiči protokolování SQL (ne Hibernate), aby se vše ověřilo. Může být také užitečné pro ladění kódu ovladače.

Budete se muset rozhodnout o rozdělení záznamů podle paketů ve smyčce

    for (Record record : records) { 

    }

Řidič to může udělat za vás, takže ho nebudete potřebovat. Ale je lepší odladit i tuto věc.

P. S. Nepoužívejte var všude.




  1. LEN() vs DATALENGTH() na serveru SQL

  2. PŘEVOD MySQL dotazu na SQL Server (MSSQL / SQLSRV) (S DISTINCT)

  3. Který DATATYPE je lepší použít TEXT nebo VARCHAR?

  4. SELECT nebo INSERT řádek v jednom příkazu