1. 程式人生 > >java實現oracle 快速解除安裝資料並ftp上傳資料給各個其他業務系統[從學習到工作(一)]

java實現oracle 快速解除安裝資料並ftp上傳資料給各個其他業務系統[從學習到工作(一)]

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基礎去完成功能,可是進入工作後我們要考慮的東西就不只是完成功能啦,我們要考慮程式的效能與效率