java實現oracle 快速解除安裝資料並ftp上傳資料給各個其他業務系統[從學習到工作(一)]
阿新 • • 發佈:2018-11-28
1.java解除安裝資料(ociuldr user=anysql/anysql query="select * from tab" field="|")
我們通常會採用jdbc操作資料庫然後用io寫入檔案,而在大資料的情況下用io寫入檔案是比較慢的,所以在工作中,我們會採用oracle的ociuldr.exe命令進行解除安裝資料下面是部分程式碼
<span style="font-size:14px;">strCmd=ociuldr.exe user="query/[email protected]" file="e:\interface\jxjk\20130630\in_biz_ba.txt" query="select data_date, barg_no, ba_no, area_no, org_no, currency, cust_no, cust_type, cust_name, draw_date, mature_date, face_amt, bail_acct, assure_mode, ead_rate, cash_flag, cash_date, status, manager_no from in_biz_ba where data_date= date'2013-06-30'" field="|" Runtime rt = Runtime.getRuntime(); Process pro = rt.exec(strCmd); if (pro.waitFor() == 0) {}</span>
2.ftp上傳資料到目標位置
我們將第一步生成的txt檔案,通過ftp上傳到指定伺服器下面是部分邏輯實現的程式碼
<span style="font-size:14px;">package com.sunline.pds; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.SocketException; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import com.sunline.pds.util.Para; public class FTP { Para p = null; public FTP(Para p) { this.p = p; } private FTPClient ftp; /** * * @param path 上傳到ftp伺服器哪個路徑下 * @param addr 地址 * @param port 埠號 * @param username 使用者名稱 * @param password 密碼 * @return * @throws Exception */ private boolean connect(String path,String addr,int port,String username,String password){ boolean result = false; ftp = new FTPClient(); int reply; try { ftp.connect(addr,port); ftp.login(username,password); ftp.setFileType(FTPClient.BINARY_FILE_TYPE); reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return result; } ftp.changeWorkingDirectory(path); result = true; } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } /** * * @param file 上傳的檔案或資料夾 * @throws Exception */ private void upload(File file){ try { if(file.isDirectory()){ ftp.makeDirectory(file.getName()); ftp.changeWorkingDirectory(file.getName()); String[] files = file.list(); for (int i = 0; i < files.length; i++) { File file1 = new File(file.getPath()+"\\"+files[i]); if(file1.isDirectory()){ upload(file1); ftp.changeToParentDirectory(); }else{ File file2 = new File(file.getPath()+"\\"+files[i]); FileInputStream input = new FileInputStream(file2); ftp.storeFile(file2.getName(), input); input.close(); } } }else{ File file2 = new File(file.getPath()); FileInputStream input = new FileInputStream(file2); ftp.storeFile(file2.getName(), input); input.close(); } } catch(Exception e) { e.printStackTrace(); } } private void disConnect() { try { ftp.disconnect(); } catch (IOException e) { e.printStackTrace(); } } public void upFtp(String date) { String etlDate = date.replace("-", ""); this.connect(p.getUpDir(), p.getUpip(), 21, p.getFtpName(), p.getFtpPass()); File file = new File(p.getFileDir()+etlDate); this.upload(file); System.out.println("上傳成功"); this.disConnect(); } /*public static void main(String[] args) throws Exception{ FTP t = new FTP(); t.connect("/jxjk/", "10.10.1.39", 21, "administrator", "passwd"); File file = new File("e:\\interface\\jxjk\\/jxjk/"); System.out.println(file.getName()); t.upload(file); t.disConnect(); } */ }</span>
3.java呼叫sqlldr將txt檔案匯入到指定的表中(sqlldr username/[email protected] control=*.ctl)
我們可以通過IO操作通過對字串的操作,通過string.split分割,然後迴圈將資料插入到表中,可以完成操作,可是速度比較慢。所以我們呼叫oracle的sqlldr完成對資料的匯入。下面是部分程式碼
<span style="font-size:14px;">strCmd="sqlldr.exe query/[email protected] control=控制檔案目錄(d:/tableName.ctl)" log="d:\tablename.log" bad="d:\tablename.bad" direct=true" Runtime rt = Runtime.getRuntime(); Process pro = rt.exec(strCmd); if (pro.waitFor() == 0) {}</span>
控制檔案格式
load data infile 'd:\tablename.txt' append into table tablename fields terminated by '|||' TRAILING NULLCOLS (a varchar2, b number, c varchar2) 總結:以前學習時,由於資料量都不大我們很少關注程式的效能,只知道運用java基礎去完成功能,可是進入工作後我們要考慮的東西就不只是完成功能啦,我們要考慮程式的效能與效率