====== Batch() ======
* description :
* author : 도봉산핵주먹
* email : hylee@repia.com
* lastupdate : 2020-05-07
===== 적용 이유 =====
> PAN*** (수집기)내부 프로젝트 진행 중 수집 데이터 건마다 DB 커넥트를 해서 부하가 생김.
> 커넥트를 최대한 줄이기 위해 구현함.
===== 기존 소스 =====
public class RpCubridinsert
{
--- 생략 ---
List cllctVOs = new ArrayList<>();
// 수집한 데이터 조회
cllctVOs = dbUtil.getCllctSelectList(mode, sDate, eDate, runType);
// 수집데이터 갯수 만큼 반복
for(RpCllctVO cllctVO: cllctVOs)
{
dbUtilCu.insertCllctCubridData(cllctVO);
}
--- 생략 ---
}
public int insertCllctCubridData(RpCllctVO cllctVO) throws SQLException, UnsupportedEncodingException
{
DBManagerCu dbm = DBManagerCu.getInstanceCu();
Connection conn = dbm.getConnection();
PreparedStatement pstmt = null;
int ret = 0;
String sqlText;
sqlText = " INSERT INTO TB_INSEQCMS_BBS_DATA "
+ " ( "
+ " BBS_ID "
+ " ,SEQ "
+ " -- 등등 생략 -- "
+ " ) "
+ " VALUES "
+ " ( "
+ " 'news-media' "
+ " ,? "
+ " -- 등등 생략 -- "
+ ") ";
try
{
pstmt = conn.prepareStatement(sqlText);
pstmt.setInt(1, cllctVO.getBitnaraSeq());
-- 등등 생략 --
ret = pstmt.executeUpdate();
}
finally
{
dbm.freeConnection(conn, pstmt);
}
return ret;
}
===== batch() 적용 소스 =====
public class RpCubridinsert
{
--- 생략 ---
List cllctVOs = new ArrayList<>();
// 수집한 데이터 조회
cllctVOs = dbUtil.getCllctSelectList(mode, sDate, eDate, runType);
// cllctVOs 수집 List 데이터를 가지고
// insert 모듈 호출
dbUtilCu.insertCllctCubridData(cllctVOs);
--- 생략 ---
}
// 수집한 데이터 조회
cllctVOs = dbUtil.getCllctSelectList(mode, sDate, eDate, runType);
dbUtilCu.cllctBatchData(cllctVOs);
public int insertCllctCubridData(RpCllctVO cllctVO) throws SQLException, UnsupportedEncodingException
{
DBManagerCu dbm = DBManagerCu.getInstanceCu();
Connection conn = dbm.getConnection();
PreparedStatement pstmt = null;
int ret = 0;
String sqlText;
sqlText = " INSERT INTO TB_INSEQCMS_BBS_DATA "
+ " ( "
+ " BBS_ID "
+ " ,SEQ "
+ " -- 등등 생략 -- "
+ " ) "
+ " VALUES "
+ " ( "
+ " 'news-media' "
+ " ,? "
+ " -- 등등 생략 -- "
+ ") ";
pstmt = conn.prepareStatement(sqlText);
for(RpCllctVO cllctVO: cllctVOs)
{
try
{
pstmt.setInt(1, cllctVO.getBitnaraSeq());
-- 등등 생략 --
// Batch Job으로 모은다.
pstmt.addBatch();
}
catch(Exception e)
{
e.printStackTrace();
}
}
// Batch Job으로 모은걸 한번에 실행한다.
pstmt.executeBatch();
try {
pstmt.close();
psFileTmt.close();
psMariaTmt.close();
} catch (Exception e2) {e2.printStackTrace();}
try {
connCu.close();
conn.close();
} catch (Exception e2) {e2.printStackTrace();}
}
=== 중요 내용 ===
> addBatch()를 사용하면 SQL문장을 LIST에 올려 놓고 executeBatch()를 사용 할 때 비로서 실제 DataBase에 저장 또는 변경 되는 것입니다.
=== 소스 출처 ===
> 위 소스는 내부 프로젝트 P * * * (기업)에서 검증이 되었습니다.
===== Tip =====
> 10만건 이상 List에 올렸다가 한번에 실행하면 오류가 날수도있다.
if( (count % 100000) == 0){
System.out.println(count + "건 처리중");
pstmt.executeBatch();
}
> for문안에 addBatch() 를 하고 카운터를 늘린다음 10만건이 되면 바로 Batch()를 실행해야한다.
===== Troubleshooting =====
===== Ref =====
* [[http://ojc.asia/bbs/board.php?bo_table=LecJDBC&wr_id=25|한번에 여러 레코드 입력시 addBatch() 쓰세요]]
{{tag>주레피 도봉산핵주먹 .Batch() javaDB 데이터대용량처리}}