자바를 이용해 Oracle 에 대용량 데이터를 넣는 방법은 크게 두 가지로 볼 수 있다.
Insert 시 executeBatch를 이용하는 방법과 CSV나 TEXT 파일로 떨군 뒤, 오라클의
SQL Loader를 이용하여 올리는 방법이다.
개인적으로 Insert 시 에러나 Log를 남길 수 있는 두번째 방법을 추천하고 싶다.
1. Data를 파일에 쓰기
Data를 파일에 떨군다. 이번 예제에서는 구분자를 '|' 로 하였고, log를 확장자로 입력하였다.
txt 파일이어도 상관은 없다.
2. CTL File 생성
public static void createOrReplaceCtlFile(String fileName) {
try {
System.out.println("CTL FILE WRITTER START");
File ctlFile = new File(SFTP_WORKINGDIR + fileName + ".ctl");
FileWriter fw = new FileWriter(ctlFile, false);
BufferedWriter bw = new BufferedWriter(fw);
String ctlFileContent = "LOAD DATA" + "\r\n"
+ " INFILE '" + SFTP_WORKINGDIR + fileName + ".log'\r\n"
+ " BADFILE '" + SFTP_WORKINGDIR + fileName + ".bad'\r\n"
+ " DISCARDFILE '" + SFTP_WORKINGDIR + fileName + ".dcs'\r\n"
+ " APPEND\r\n"
+ " INTO TABLE BEACON.BEACON_LOG\r\n"
+ " FIELDS TERMINATED BY '|'\r\n"
+ "(\r\n"
+ " GUID CHAR(36)\r\n"
+ " ,EMAIL CHAR(50)\r\n"
+ " ,TIME_ZONE CHAR(100)\r\n"
+ " ,PUSH_TOKEN CHAR(200)\r\n"
+ " ,PLATFORM_TYPE CHAR(30)\r\n"
+ " ,OS_VERSION CHAR(100)\r\n"
+ " ,APP_VERSION CHAR(100)\r\n"
+ " ,TIME_STAMP DATE \"YYYY-MM-DD HH24:MI:SS\"\r\n"
+ " ,PARSE_TIME_STAMP DATE \"YYYY-MM-DD HH24:MI:SS\"\r\n"
+ " ,BEACON_UUID CHAR(100)\r\n"
+ " ,BEACON_MAJOR_VERSION CHAR(100)\r\n"
+ " ,BEACON_MINOR_VERSION CHAR(100)\r\n"
+ " ,SIGNAL_STRENGTH INTEGER EXTERNAL\r\n"
+ " ,CREATE_BY CHAR(24)\r\n"
+ " ,MODIFY_BY CHAR(24)\r\n"
+ " ,CREATE_DATE DATE \"YYYY-MM-DD HH24:MI:SS\"\r\n"
+ " ,MODIFY_DATE DATE \"YYYY-MM-DD HH24:MI:SS\"\r\n"
+ " ,APP_NAME CHAR(100)\r\n"
+ " ,ACCOUNT_ID CHAR(24)\r\n"
+ " ,MODEL_NO CHAR(50)\r\n"
+ " ,BATTERY INTEGER EXTERNAL\r\n"
+ ")";
bw.write(ctlFileContent);
bw.close();
fw.close();
System.out.println("CTL FILE WRITTER END");
} catch (Exception e) {
e.printStackTrace();
}
}
3. 자바로 SQL Loader 실행
// Window 실행시
public static void execWindowCtl(String fileName) {
String concatFileInfo = SFTP_WORKINGDIR + fileName;
try {
String sqlldr = "sqlldr control="+ concatFileInfo +".ctl userid=userid=id/pw@TNS log=" + concatFileInfo +".logger";
Process p = Runtime.getRuntime().exec(sqlldr);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 리눅시 일때
public static void execLinuxCtl(String fileName) {
String concatFileInfo = SFTP_WORKINGDIR + fileName;
try {
String sqlldr = "sqlldr control="+ concatFileInfo +".ctl userid=id/pw@TNS log=" + concatFileInfo +".logger";
Process p = Runtime.getRuntime().exec(sqlldr);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
'Java & Spring > Java 문법' 카테고리의 다른 글
[Java Util] 문자열 내 HTML 태그 사용 특수문자 치환 (0) | 2016.02.12 |
---|---|
[Java] GSON 을 이용한 JSON to Generic/VO 또는 GenericVO to JSON (0) | 2015.12.30 |
[Java] Jackson Json 파싱 예제 (0) | 2015.09.09 |
[JAVA] Jackson을 이용한 Java JSON 파싱 (0) | 2015.09.09 |
[Java] Bean을 Map으로, bean to Map, bean 2 map (1) | 2015.04.23 |
WRITTEN BY