티스토리 뷰
반응형
오라클 pro*c에서 부득이하게 DBMS Call를 통해 클라이언트로 데이터를 fetch할때 또는 반대로 insert, update 할때에
Array Processing를 하게되면 DBMS Call 횟수를 줄여 성능을 향상 시킬 수 있습니다.
pro*c에서는 host변수를 배열로 만들어 Array Processing를 수행합니다.
pro*c로 하는 Array Processing은 쉽게 찾아 볼 수 있음으로 생략하구요.
자바를 활용한 Array Processing 샘플이 있어 소개해 드려요.
출처> http://www.gurubee.net/pages/viewpage.action?pageId=3901805
public class JavaArrayProcessing{ public static void insertData( Connection con , PreparedStatement st , String param1 , String param2 , String param3 , long param4) throws Exception{ st.setString(1, param1); st.setString(2, param2); st.setString(3, param3); st.setLong(4, param4); st.addBatch(); // Batch처리를 위한 묶음으로 등록 } public static void execute(Connection con, String input_month) throws Exception { long rows = 0; String SQLStmt1 = "SELECT 고객번호, 납입월" + " , 지로, 자동이체, 신용카드, 핸드폰, 인터넷 " + "FROM 월요금납부실적 " + "WHERE 납입월 = ?"; String SQLStmt2 = "INSERT /*+ test3 */ INTO 납입방법별_월요금집계 " + "(고객번호, 납입월, 납입방법코드, 납입금액) " + "VALUES(?, ?, ?, ?)"; con.setAutoCommit(false); PreparedStatement stmt1 = con.prepareStatement(SQLStmt1); PreparedStatement stmt2 = con.prepareStatement(SQLStmt2); stmt1.setFetchSize(1000); //Array Size 지정. 너무 커도 좋지 않음. 저는 보통 500 또는 1000을 사용함 stmt1.setString(1, input_month); ResultSet rs = stmt1.executeQuery(); while(rs.next()){ String 고객번호 = rs.getString(1); String 납입월 = rs.getString(2); long 지로 = rs.getLong(3); long 자동이체 = rs.getLong(4); long 신용카드 = rs.getLong(5); long 핸드폰 = rs.getLong(6); long 인터넷 = rs.getLong(7); if(지로 > 0) insertData (con, stmt2, 고객번호, 납입월, "A", 지로); if(자동이체 > 0) insertData (con, stmt2, 고객번호, 납입월, "B", 자동이체); if(신용카드 > 0) insertData (con, stmt2, 고객번호, 납입월, "C", 신용카드); if(핸드폰 > 0) insertData (con, stmt2, 고객번호, 납입월, "D", 핸드폰); if(인터넷 > 0) insertData (con, stmt2, 고객번호, 납입월, "E", 인터넷); if(++rows%1000 == 0) stmt2.executeBatch(); // 1000건마다 배치 수행 } rs.close(); stmt1.close(); stmt2.executeBatch(); stmt2.close(); con.commit(); con.setAutoCommit(true); } public static void main(String[] args) throws Exception{ long btm = System.currentTimeMillis(); Connection con = getConnection(); execute(con, "200903"); System.out.println("elapsed time : " + (System.currentTimeMillis() - btm)); releaseConnection(con); } |
요약하자면 Select 즉 fetch는 ResultSet.setFetchSize() or PreparedStatement.setFetchSize() 함수를 통해서 구현하구요.
Insert, Update는 PreparedStatement.addBatch() 와 PreparedStatement.executeBatch() 함수를 통해서 구현하고 있군요.
addBatch()는 사용한 적이 있었지만 setFetchSize()는 사용해본적이 없었더군요.
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 솔리드 쿨론
- 빈센트 반 고흐
- 홈 오피스
- 오미크론
- 로니카 BCS
- 코라나 19
- 매직 트랙패드2
- 카카오 에드
- 별이 빚나는 밤
- node.js
- 별잉 빛나는 밤
- 톡토기
- 브리다 정수기
- Life Chair
- JMW 헤어드라이기기
- yugabyteDB
- 배당급
- 남설 팔찌
- 파나소닉 비데 DL-EH10KWS
- weka
- 루미큐브 종류
- GKRS
- 유가바이트디비
- 고체 향수
- 증권정보포털
- 화분벌레
- VARIDESK
- Pixel Pals
- 르세라핌
- Sybase IQ
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함