1問題
生產環境一個批量處理沒有完成。
2分析
批量處理邏輯:
java->shell->sqlldr
檢查數據庫會話,發現對應會話等待事件為SQL*Net message from client,對應v$session.program為sqlldr@xxx,v$session.seq#保持不變,持續超過5個小時(6:45-12:20)。
查詢數據庫加載的表,發現已加載部分數據,但對應sqlldr日志為空。
對應sqlldr命令如下:
sqlldr user/pwd data=a.txt control=a.ctl log=a.log bad=a.bad discard=a.dis errors=9999999 rows=1000
在測試環境驗證,sqlldr直接運行時,可以順利加載所有數據;通過java->shell->sqlldr方式運行時,在加載特定行數后停止,問題可以重現。
在進行以上測試時,sqlldr直接運行時,當前窗口會輸出已加載了xx行。其實,問題正出在這里。通過java->shell->sqlldr方式運行時,標準輸出沒有程序讀取,在要加載的數據量達到一定程度時(超過缺省緩沖區大小),就會導致加載過程停止。
驗證過程參考附錄。
3解決方案
處理sqlldr的標準輸出與錯誤輸出,可選方法:
方法一: sqlldr ... silent=(ALL)
方法二: sqlldr .... 1>std.log 2>err.log
附,測試腳本
--RunShell.java
import java.util.Date;
import java.text.SimpleDateFormat;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class RunShell {
public static void main(String[] args){
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String shpath="/home/oracle/java/test.sh";
System.out.println("---1--" + df.format(new Date()));
Process ps = Runtime.getRuntime().exec(shpath);
System.out.println("---2--" + df.format(new Date()));
//ps.waitFor();
BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
String loop = args[0];
System.out.println(loop);
String line;
while ("0".equals(loop) && (line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("---3--" + df.format(new Date()));
ps.waitFor();
System.out.println("---4--" + df.format(new Date()));
}
catch (Exception e) {
e.printStackTrace();
}
}
}
--test.sh
seq -w 1 100000|awk '{print $0"xxxxxxxxxxxxxx"}'
測試1--傳入參數0,主線程主動讀取shell的標準輸出
java RunShell 0
---1--2018-04-20 13:23:25
---2--2018-04-20 13:23:25
0
...
...
---3--2018-04-20 13:23:34
---4--2018-04-20 13:23:34
==〉可以順利完成
測試2--傳入參數1,主線程不讀取shell的標準輸出
java RunShell 1
---1--2018-04-20 13:28:30
---2--2018-04-20 13:28:30
1
---3--2018-04-20 13:28:30
==〉長時間掛起
Ctrl-C
^C---4--2018-04-20 16:37:08
當前題目:sqlldr標準輸出未處理導致批處理掛起問題
URL分享:http://www.yijiale78.com/article46/gceoeg.html
成都網站建設公司_創新互聯,為您提供建站公司、Google、電子商務、響應式網站、云服務器、網站制作
廣告
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源:
創新互聯