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