-
Array Processing 기능을 활용한 예제(대용량 처리 방법)개발 관련/JSP 2013. 2. 27. 11:18
쿼리문을 모아서 한번에 처리하는 명령어입니다.
우선 아래 소스를 비교해서 올려봤습니다.
기존의 방식
String queryUpdate = "UPDATE patent SET important_patent = 'Y' WHERE patent_seq = ?";
con = SeoConnectionManager.getConnection();
for(int i = 0; i<patentSeqArray.length; i++) {
ps = con.prepareStatement(queryUpdate);
ps.setString(1, patentSeqArray[i]);
ps.executeUpdate()
}
batch적용
try {
String queryUpdate = "UPDATE patent SET important_patent = 'Y' WHERE patent_seq = ?";
con = SeoConnectionManager.getConnection();
con.setAutoCommit(false);
ps = con.prepareStatement(queryUpdate);
for(int i = 0; i<patentSeqArray.length; i++) {
ps.setString(1, patentSeqArray[i]);
// 추가
ps.addBatch();
// 계속 추가하면 outOfMemory 에러가 나기 때문에
// 1000개씩 executeBatch() 해줍니다.
if( i % 1000 == 0) {
updateCounts = ps.executeBatch();
}
}
// 나머지 처리
updateCounts = ps.executeBatch();
}catch{
con.rollback();
}
우선. 일괄처리를 하는 큰 이유는 속도 입니다.
기존의 방식은 매 for문 마다 쿼리문을(ps) 얻고 실행을 합니다.
처리할 데이터가 적을때는 문제가 없겠지만. 많으면 느려지겠죠
반면에 Batch는 쿼리문을(ps) 처음에 한번 얻고 addBatch()로
추가를 합니다..그리고 모아서 일괄처리를 하죠.
실제로 일괄처리가 속도가 더 빠르다는 테스트 결과도 있습니다^^
아.. 그리고 batch를 쓰기전에 오토커밋을 false로 해줘야 합니다.
exception 발생했을 경우 rollback 할수 있도록
참고: Oracle Array Processing 활용
출처: http://blog.daum.net/turnnig-pointer/16498246
'개발 관련 > JSP' 카테고리의 다른 글
JSP & Servlet 에서 세션 사용하는 방법 (0) 2012.08.07 국제화 태그 라이브러리 (0) 2012.04.12 코어(core) 태그 라이브러리 (0) 2012.04.06 JSTL이 제공하는 태그의 종류 (0) 2012.04.06 EL(Expression Language)이 제공하는 11개의 기본 객체 (0) 2012.04.05