반응형


자바를 이용해 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();

}


}



반응형

WRITTEN BY
데르벨준

,