소개
JPA가 조회할 때 효과적이고, 단건 저장시에도 사용이 용이하지만,
대량 데이터를 저장할 때, JPA의 saveAll은 INSERT,UPDATE를 1건당 호출하면서
메모리, CPU 사용량 문제가 될 수 있으며, 속도 저하의 원인이 된다.
jdbcTemplate.batchUpdate를 이용하면 하나의 Row로 여러개를 저장하는 쿼리를 만들어주기 때문에, 이러한 문제가 방지된다.
예시) 1,000개의 리스트 → JPA Insert 1000번 호출 → jdbc Insert 1번 호출
코드
INSERT
javapublic void bulkInsertResults(List<ApiResponse> results) { String sql = "INSERT INTO sample (data, status) VALUES (?, ?)"; jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setString(1, results.get(i).getData()); ps.setString(2, results.get(i).getStatus()); } @Override public int getBatchSize() { return results.size(); } }); }
UPDATE
javapublic void bulkUpdateResults(List<ApiResponse> results) { String sql = "UPDATE sample SET status = ?, updated_at = NOW() WHERE id = ?"; jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setString(1, results.get(i).getStatus()); ps.setLong(2, results.get(i).getId()); } @Override public int getBatchSize() { return results.size(); } }); }