Bulk Insert

최혜환·2024년 3월 3일
0

JPA

목록 보기
4/5

이전 블로그 에서 jdbcTemplate 을 이용해 bulk insert 를 다뤘다.

관련된 개념들과 다른 블로그에서 알게 된 내용들을 추가적으로 작성해보려고 한다.

jdbcTemplate 를 이용한 bulk insert 예시

  1. ID 값을 참조해 insert 가 필요할 때 (LAST_INSERT_ID() 사용)
String query1 = "insert into temp1() values (?,?,?);
String query2 = "insert into temp2() values(?,?,(select LAST_INSERT_ID()));

String sql = query1+query2;

jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
	@Override
    public void setValues(PreparedStatement ps, int i) throws SQLException {
    	ps.setString(1, ~~~);
    }
    
    @Override
    public int getBatchSize() { return query1.size(); }
}
  1. 참조값이 필요없거나 이미 참조값을 가져올 수 있을 때
public void batchInsert(List<data> datas) {
	String sql = "insert into table(" +
    "column1, " +
    "column2, " +
    "column3" +
    ") values (:column1, :column2, :column3)";
    
    SqlParameterSource[] sqlParameterSources = SqlParameterSourceUtils.createBatch(datas);
    namedParameterJdbcTemplate.batchUpdate(sql, sqlParameterSources);
}

createBatch, batchUpdate 를 이용해 모든 파라미터 값을 리스트로 한 번에 전달할 수 있다.
프레임워크 내부에서 BatchPreparedStatementSetter 를 사용해서 리스트 값을 반복 처리한다.

named 파라미터를 사용한다면 SqlParameterSource 의 배열을 제공해야 하며, 엔트리 하나가 배치의 한 사이클을 처리한다. SqlParameterSource 배열은 간편하게 SqlParameterSourceUtils.createBatch 메소드로 만들 수 있고 Map 에 담긴 파라미터나 List 에 담긴 파라미터를 전달할 수 있다.

  1. LAST_INSERT_ID()
  • 이 함수는 가장 먼저에 성공적으로 수행된 insert 구분의 첫번째 auto_increment column 값을 반환한다.
insert into test values ('mary'),('jane'),('lisa');
select LAST_INSERT_ID(); => 1
  1. JPA 기본 키 생성 전략과 특징 (@GenerationType)
  • Auto : DB 에 따라 자동으로 3가지 전략 중 하나를 선택한다.
  • Identity : 기본키 생성을 DB에게 위임한다. (MySQL 인 경우 Auto_increment).
  • Sequence : 오라클, H2, PostgreSQL 에서 사용한다. sequence 객체를 사용하지 않는 DB 벤더를 이용할 경우 Sequence를 관리할 테이블을 생성해야 한다. allocationSize 로 한번에 사용할 시퀀스 덩어리 사이즈를 정해서 최적화할 수 있다.
  • Tabe : Sequence 대신 테이블을 사용하고 Sequence 전략과 동작하는 방식이 같다.
  1. Identity, Sequence 차이점
    Identity 전략은 엔티티를 DB 에 저장한 후 식별자를 조회해 엔티티의 식별자에 할당하고 영속성 컨텍스트에 저장한다.
    Sequence 전략은 entityManager.persist() 를 호출할 때 먼저 데이터베이스 시퀀스를 사용해 식별자를 조회한다. 그리고 조회한 식별자를 엔티티에 할당한 후 해당 엔티티를 영속성 컨텍스트에 저장한다. 다음으로 트랜잭션 커밋 시점에 flush 가 발생하면 엔티티를 DB에 저장한다.

엔티티 생명주기

0개의 댓글

관련 채용 정보