成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

數據庫 Oracle
今天,系統中的一個業務處理莫名地執行了6個小時都沒有結束,正常處理也就是3分鐘左右,對原因進行定位,發現是在Oracle客戶端上同步執行一個命令沒有響應。今天來分享一下這個問題,讓更多的人避開這個坑。

[[426800]]

今天,系統中的一個業務處理莫名地執行了6個小時都沒有結束,正常處理也就是3分鐘左右,對原因進行定位,發現是在Oracle客戶端上同步執行一個命令沒有響應。今天來分享一下這個問題,讓更多的人避開這個坑。

1 業務場景

我們要把一個csv文件(文件名biz.csv)中的數據讀取到Oracle數據庫表(表名t_biz,t_biz)中,數據庫表t_biz表結構如下:

biz.csv文件內容如下:

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

把biz.csv文件的內容讀入到表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 是要訪問的數據庫實例的用戶名/密碼,biz 是數據庫實例名稱。T_BIZ.ctl是控制文件,內容如下:

  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) 

業務代碼中調用這個命令,代碼如下:

  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 問題現場

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

數據庫情況:

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

3 原因分析

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

3.1 Oracle版本低

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

3.2 數據落庫情況

本以為sqlldr命令執行失敗了,但是文件數據已經全部落到t_biz表。這說明命令執行成功了,只是Oracle沒有給應用返回結果。難道是Oracle數據庫hang住了?但是上面的問題現場已經確認,Oracle并沒有hang在sqlldr這個命令上。

3.3 最終答案

看了好多博客,最后發現竟然不是Oracle的原因。根本原因是使用java執行shell時,如果不讀取標準輸出,這個輸出就會輸出到缺省緩沖區,如果輸出流太大,必將打滿緩沖區,導致程序hang住。

從上面問題現場的手工執行中可以看到,因為加載的數據量很大大,結果輸出也流非常大,這很容易超出缺省緩沖區大小。

4 解決方案

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

4.1 增加參數

在sqlldr命令后面增加一個參數,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 程序讀取標準輸出

程序中讀取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 文件接收標準輸出

可以在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 1>/home/jinjunzhu/biz/std.log 2>/home/jinjunzhu/biz/err.log 

5 總結

這個問題剛出現的時候,一直以為是Oracle的問題,但是后來研究發現,這個鍋真的不能讓Oracle來背。關于sqlldr命令的詳細參數介紹,已經比較成熟,大家可以自行網絡查找。

【編輯推薦】

 

責任編輯:姜華 來源: 程序員jinjunzhu
相關推薦

2021-02-09 09:50:21

SQLOracle應用

2020-03-12 15:00:44

JavaSpring依賴

2018-07-06 05:05:07

2022-01-03 20:13:08

Gointerface 面試

2020-06-01 14:02:25

Vue.js框架模板

2021-02-24 09:43:36

MySQL數據庫雙引號

2022-07-26 01:00:12

Eureka延遲注冊

2020-04-02 07:31:53

RPC超時服務端

2022-06-24 14:52:34

AI模型

2021-07-05 18:05:40

SpringBean方法

2020-11-03 06:57:10

MyBatis數據庫

2019-09-18 15:20:16

MyBatisSQL數據庫

2024-10-09 09:07:10

JVM優化String類JDK1.6

2015-05-14 12:41:45

智能

2021-04-16 07:04:53

SQLOracle故障

2021-06-29 10:02:04

亞馬遜機器解雇

2018-10-15 15:42:57

數字化企業轉型

2021-01-01 09:03:44

故障HAProxy服務器

2023-11-23 16:46:55

LinuxAWK運維

2020-01-06 09:14:59

Java程序員線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品不卡一区 | 精品国产乱码久久久久久久久 | 午夜视频一区二区三区 | 看片国产| 天天干成人网 | 色婷婷国产精品 | 亚洲电影第1页 | 日本福利一区 | 日韩一区二区三区视频 | 久久国产欧美日韩精品 | 天天综合网天天综合 | 精品一级 | 蜜桃视频一区二区三区 | 在线中文字幕av | 成人在线电影在线观看 | 亚洲精品3 | 中文字幕在线精品 | 国产一区二区三区视频在线观看 | 午夜精品久久久久久久星辰影院 | 日韩三级 | 一二三区视频 | 一级美国黄色片 | 亚洲97| 一本一道久久a久久精品综合蜜臀 | 伊人网在线综合 | 精品视频一区在线 | 韩日在线| 一区二区三区国产好的精 | 在线欧美视频 | 欧美一级网站 | 日韩一区二区三区视频 | 精品国产乱码一区二区三区 | 99精品亚洲国产精品久久不卡 | 日韩av免费在线观看 | 亚洲精品高清视频 | 亚州精品天堂中文字幕 | 久久久久久一区 | 天天看片天天干 | 国产成人精品综合 | 97色在线视频 | 久久久免费电影 |