1,000,000건이 넘어가는 파일을 line단위로 파싱 하여 Table에 전부 Insert 시켜야 하는 작업이 필요할 수 있습니다.
파일의 라인을 하나하나 읽어 들여 각각 PreparedStatement를 생성하고 Insert문을 execute() 시킬 수 있습니다.
이런 방법은 간단하지만 파일의 데이터 건수가 많은 경우, 건수만큼 매번 DB서버와의 연결이 필요하고 Insert작업이 DB 서버에 부하를 발생시켜 속도가 매우 느릴 수 있습니다.
PreparedStatement의 addBatch() 메서드를 활용하여 이러한 문제를 해결할 수 있습니다.
addBatch()를 사용하면 쿼리를 건별로 수행하지 않고, 여러 개의 쿼리들을 메모리에 올려놓고 모아둔 쿼리들을 한 번에 실행시켜 수행 속도를 많이 개선할 수 있습니다.
주의할 점은 쿼리를 메모리에 저장할 때 너무 많은 쿼리를 저장하면 OutOfMemory가 발생할 수 있으므로, 처리하고자 하는 데이터의 건수를 고려하여 중간에 일정 개수만큼 모으면 일괄 실행시키고 나머지 작업을 이어가는 것이 좋습니다.
addBatch()를 사용하는 경우 execute()가 아니라 executeBatch()를 활용하여 실행시킬 수 있습니다.
try {
//pstmt.executeUpdate(); // 일반적인 처리방법
pstmt.addBatch(); // addBatch로 쿼리를 저장
pstmt.clearParameters();
if((cnt % 15000) == 0) { // 저장할 개수를 15,000개로 지정
pstmt.executeBatch(); // 15,000개의 쿼리를 실행시킴
pstmt.clearBatch();
conn.commit();
}
} catch (Exception e) {
e.printStackTrace();
}
pstmt.executeBatch(); // 나머지 건들 처리
conn.commit();
'JAVA > java' 카테고리의 다른 글
toString() (0) | 2020.04.20 |
---|---|
hashCode() (0) | 2020.04.20 |
private (0) | 2020.04.20 |
final (0) | 2020.04.20 |
static (0) | 2020.04.20 |