自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

驚呆,Oracle的這個坑竟然讓我踩上了

數(shù)據(jù)庫 Oracle
今天,系統(tǒng)中的一個業(yè)務(wù)處理莫名地執(zhí)行了6個小時都沒有結(jié)束,正常處理也就是3分鐘左右,對原因進行定位,發(fā)現(xiàn)是在Oracle客戶端上同步執(zhí)行一個命令沒有響應(yīng)。今天來分享一下這個問題,讓更多的人避開這個坑。

[[426800]]

今天,系統(tǒng)中的一個業(yè)務(wù)處理莫名地執(zhí)行了6個小時都沒有結(jié)束,正常處理也就是3分鐘左右,對原因進行定位,發(fā)現(xiàn)是在Oracle客戶端上同步執(zhí)行一個命令沒有響應(yīng)。今天來分享一下這個問題,讓更多的人避開這個坑。

1 業(yè)務(wù)場景

我們要把一個csv文件(文件名biz.csv)中的數(shù)據(jù)讀取到Oracle數(shù)據(jù)庫表(表名t_biz,t_biz)中,數(shù)據(jù)庫表t_biz表結(jié)構(gòu)如下:

biz.csv文件內(nèi)容如下:

  1. id,a,b,c 
  2. 1,a1,b1,c1 
  3. 2,a2,b2,c2 
  4. 3,a3,b3,c3 

把biz.csv文件的內(nèi)容讀入到表t_biz,為了提高效率,這里使用了sqlldr 命令,命令如下:

  1. sqlldr test/test123@biz control=/home/jinjunzhu/biz/T_BIZ.ctl log=/home/jinjunzhu/biz/T_BIZ.log bad=/home/jinjunzhu/biz/T_BIZ.bad 

解釋一下這個命令,test/test123 是要訪問的數(shù)據(jù)庫實例的用戶名/密碼,biz 是數(shù)據(jù)庫實例名稱。T_BIZ.ctl是控制文件,內(nèi)容如下:

  1. options(skip=1,rows=10000,errors=0,parallel=true,bindsize=1048576,readsize=1048576) 
  2. load data  
  3. infile '/home/jinjunzhu/biz/biz.csv' 
  4. fields terminated by ',' 
  5. truncate into table day_data 
  6. trailing nullcols 
  7. (id,a,b,c) 

業(yè)務(wù)代碼中調(diào)用這個命令,代碼如下:

  1. private int execute(String cmd) throws Exception{ 
  2.     Process process = Runtime.getRuntime().exec(new String[]{"/bin/bash""-c", cmd}); 
  3.     process.waitFor(10, TimeUnit.SECONDS); 
  4.     Integer status = process.waitFor(); 
  5.     return status == null ? -1 : status; 

2 問題現(xiàn)場

程序執(zhí)行到上面第4行的時候,程序hang住了,一直沒有返回。這個代碼之前從來沒有出過問題,最近也沒有上過線,今天唯一的不同就是文件數(shù)據(jù)量越來越大,今天比昨天大了幾萬行。

數(shù)據(jù)庫情況:

  • 看不到有sqlldr命令等待的情況
  • CPU正常
  • 手工執(zhí)行上面命令可以成功,但是打印的日志非常多,如下圖:

3 原因分析

網(wǎng)上搜這個問題竟然很多,原因有下面三類:

3.1 Oracle版本低

Oracle版本低,建議升級到10.2.0.2或以上,這個方案忽略,因為我們的數(shù)據(jù)庫版本是Oracle 11.2.0.4.0。

3.2 數(shù)據(jù)落庫情況

本以為sqlldr命令執(zhí)行失敗了,但是文件數(shù)據(jù)已經(jīng)全部落到t_biz表。這說明命令執(zhí)行成功了,只是Oracle沒有給應(yīng)用返回結(jié)果。難道是Oracle數(shù)據(jù)庫hang住了?但是上面的問題現(xiàn)場已經(jīng)確認(rèn),Oracle并沒有hang在sqlldr這個命令上。

3.3 最終答案

看了好多博客,最后發(fā)現(xiàn)竟然不是Oracle的原因。根本原因是使用java執(zhí)行shell時,如果不讀取標(biāo)準(zhǔn)輸出,這個輸出就會輸出到缺省緩沖區(qū),如果輸出流太大,必將打滿緩沖區(qū),導(dǎo)致程序hang住。

從上面問題現(xiàn)場的手工執(zhí)行中可以看到,因為加載的數(shù)據(jù)量很大大,結(jié)果輸出也流非常大,這很容易超出缺省緩沖區(qū)大小。

4 解決方案

問題已經(jīng)很明確了,解決方案也就有了,處理sqlldr的輸出就可以解決。解決方法有下面三種。

4.1 增加參數(shù)

在sqlldr命令后面增加一個參數(shù),silent=(ALL),最后命令如下:

  1. sqlldr test/test123@biz control=/home/jinjunzhu/biz/T_BIZ.ctl log=/home/jinjunzhu/biz/T_BIZ.log bad=/home/jinjunzhu/biz/T_BIZ.bad silent=(ALL

4.2 程序讀取標(biāo)準(zhǔn)輸出

程序中讀取sqlldr命令返回的輸出,修改后的代碼如下:

  1. private int execute(String cmd) throws Exception{ 
  2.     Process process = Runtime.getRuntime().exec(new String[]{"/bin/bash""-c", cmd}); 
  3.     process.waitFor(10, TimeUnit.SECONDS); 
  4.     Integer status; 
  5.  
  6.     BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); 
  7.     String line; 
  8.     while ((line = br.readLine()) != null) { 
  9.         System.out.println(line); 
  10.     } 
  11.     return (status = process.waitFor()) == null ? -1 : status; 

4.3 文件接收標(biāo)準(zhǔn)輸出

可以在sqlldr命令中增加文件參數(shù)來接收命令的標(biāo)準(zhǔn)輸出,最后我采用了這種方式,命令如下:

  1. sqlldr test/test123@biz control=/home/jinjunzhu/biz/T_BIZ.ctl log=/home/jinjunzhu/biz/T_BIZ.log bad=/home/jinjunzhu/biz/T_BIZ.bad 1>/home/jinjunzhu/biz/std.log 2>/home/jinjunzhu/biz/err.log 

5 總結(jié)

這個問題剛出現(xiàn)的時候,一直以為是Oracle的問題,但是后來研究發(fā)現(xiàn),這個鍋真的不能讓Oracle來背。關(guān)于sqlldr命令的詳細參數(shù)介紹,已經(jīng)比較成熟,大家可以自行網(wǎng)絡(luò)查找。

【編輯推薦】

 

責(zé)任編輯:姜華 來源: 程序員jinjunzhu
相關(guān)推薦

2021-02-09 09:50:21

SQLOracle應(yīng)用

2020-03-12 15:00:44

JavaSpring依賴

2022-01-03 20:13:08

Gointerface 面試

2018-07-06 05:05:07

2020-06-01 14:02:25

Vue.js框架模板

2021-02-24 09:43:36

MySQL數(shù)據(jù)庫雙引號

2020-04-02 07:31:53

RPC超時服務(wù)端

2022-07-26 01:00:12

Eureka延遲注冊

2022-06-24 14:52:34

AI模型

2021-07-05 18:05:40

SpringBean方法

2019-09-18 15:20:16

MyBatisSQL數(shù)據(jù)庫

2020-11-03 06:57:10

MyBatis數(shù)據(jù)庫

2015-05-14 12:41:45

智能

2021-06-29 10:02:04

亞馬遜機器解雇

2021-04-16 07:04:53

SQLOracle故障

2018-10-15 15:42:57

數(shù)字化企業(yè)轉(zhuǎn)型

2021-01-01 09:03:44

故障HAProxy服務(wù)器

2024-10-09 09:07:10

JVM優(yōu)化String類JDK1.6

2020-07-17 11:30:39

密鑰Github數(shù)據(jù)安全

2020-01-06 09:14:59

Java程序員線程
點贊
收藏

51CTO技術(shù)棧公眾號