용어 뜻:
출처:
데이터베이스에서 퍼포먼스 향상 및 불필요한 작업의 수를 줄이려 한다면
매번 발생하는 Insert/Update/Delete 처리를 한 번의 배치 작업으로 처리할 수 있다.
JDBC 2.0의 addBatch(), executeBatch()로 구현할 수 있다.
장점: 범용성 (JDBC 2.0을 지원하는 모든 데이터베이스에서 사용 가능)
단점: Oracle Specific 모델에 비해 대량의 작업일수록 속도가 낮다.
OutofMemoryError를 방지하기 위해 executeBatch를 중간 중간 날려줘야 한다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
m_conn = getConnection();
SQLUtil sqlUtil = new SQLUtil( m_conn);
try
{
PreparedStatement ps = sqlUtil.getPreparedStatement( new StringBuffer("INSERT INTO ").append( getTableName())
.append(" ( ")
.append( getColumns())
.append(") VALUES ")
.append( getInsertValue())
.toString());
m_conn.setAutoCommit(false);
int nDefault = 100;
for( int i = 0; i < 10000; i++)
{
ps.setString( 1, "19001310095000" + ( nDefault + i));
ps.setString( 2, "1310095");
ps.setString( 3, "테스트");
ps.setString( 4, "1");
ps.setString( 5, "1900");
// .. 중간 생략
//Insert구문을 더한다.
ps.addBatch();
// 배치에 너무 많은 건수를 입력할 경우
// OutofMemoryError가 발생하기 때문에 적당하게 나누어 주어야 한다.
if( i % 5000 == 0) {
ps.executeBatch();
}
//System.out.println(parent);
}
ps.executeBatch(); // 나머지 배치처리
// executeBatch의 리턴값은 int[]이다. 각각의 int값은
// "0" 이상 -- 정상적인 처리 : 테이블의 변경된 행수를 나타낸다.
// "-2" -- 정상적인 처리, 변경된 행수가 불분명하다.
// "-3" -- 실행 실패,
m_conn.commit();
}
catch(Exception e)
{
m_conn.rollback();
e.printStackTrace();
}
finally
{
sqlUtil.close();
}
| cs |
또한 Oracle에서는 Oracle-Specific Model 이 제공해 준다.
장점: 대량의 작업일수록 퍼포먼스가 향상한다.
단점: 오라클에서만 사용해야 하므로 이식성이 떨어진다.
적절한 배치 크기를 설정해 주어야 한다.
conn.setDefaultExecuteBatch(500) & ps.setExecuteBatch(500)
이 값들을 적절히 설정해야만 최상의 퍼포먼스를 얻을 수 있다.
특징: 배치에 대한 어떠한 세팅도 이루어져 있지 않다면 Connection은
자동으로 한 건의 데이터에 대한 각각의 배치 처리를 시도하려고 한다.
오라클에서 이야기하는 최상의 퍼포먼스값은 batch 작업의 크기가 5에서 30 사이일때라고 이야기한다.
PreferenceStatement에 배치를 많이 올리고 있다고 하더라도 Commit만 만나면
Driver는 아무런 생각없이 sendBatch()라는 request를 데이터베이스로 날려서
현재 올려진 데이터를 update 시킨다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
OracleConnection conn = null;
OraclePreparedStatement ps = null;
try
{
conn = ( OracleConnection)getConnection();
conn.setAutoCommit(false);
conn.setDefaultExecuteBatch( 500);
ps = ( OraclePreparedStatement)conn.prepareStatement( new StringBuffer("INSERT INTO ").append( .append( getTableName())
.append(" ( ")
.append( getColumns())
.append(") VALUES ")
.append( getInsertValue())
.toString());
ps.setExecuteBatch( 500);
int nDefault = 100;
for( int i = 0; i < 10000; i++)
{
ps.setString( 1, "19001310095000" + (nDefault + i));
ps.setString( 2, "1310095");
ps.setString( 3, "테스트");
ps.setString( 4, "1");
ps.setString( 5, "1900");
//.. 중간생략
//이 부분에서는 DB로 아무값도 날아가지 않는다고 한다..좀 미심쩍긴 하지만 믿어야지 뭐....
ps.executeUpdate ();
}
//단 한번의 roundtrip으로 작업이 수행된다.
ps.sendBatch ();
conn.commit();
}
catch( Exception e)
{
conn.rollback();
e.printStackTrace();
}
finally
{
try
{
if( ps != null)
{
ps.close();
}
if( m_conn != null)
{
conn.close();
}
}
catch( Exception e)
{
e.printStackTrace();
}
}
| cs |
OracleConenction, OraclePreparedStatement는 classes12.zip 안에 있다.
Oracle을 설치 후 설치 디렉토리\SID\JDBC 디렉토리에 가면 demo와 doc 폴더에서 참조할 수 있다.
주의 사항: JDBC 2.0과 Oracle-Specific Model을 동시에 사용할 수는 없다.
데이터 건수가 많아질수록 Oracle-Specific Model 배치의 크기를 적절하게 주었을 때 좋은 성능을 볼 수 있다.
LIVE LOVE LIFE, 2016-10-25, http://m.blog.naver.com/inhim/100154127152
한국데이터진흥원, 2016-10-25, http://www.kodb.or.kr/info/info_06_view.php?dbnum=176504
Albumbang, 2016-10-27, http://www.albumbang.com/board/board_view.jsp?board_name=free&no=149
댓글
댓글 쓰기