成人免费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依賴

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數據庫雙引號

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方法

2015-05-14 12:41:45

智能

2020-11-03 06:57:10

MyBatis數據庫

2021-06-29 10:02:04

亞馬遜機器解雇

2019-09-18 15:20:16

MyBatisSQL數據庫

2024-10-09 09:07:10

JVM優化String類JDK1.6

2021-04-16 07:04:53

SQLOracle故障

2021-01-01 09:03:44

故障HAProxy服務器

2018-10-15 15:42:57

數字化企業轉型

2020-07-17 11:30:39

密鑰Github數據安全

2020-01-06 09:14:59

Java程序員線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费看黄网站在线观看 | 免费成人在线网站 | 天天操狠狠操 | 一区二区在线观看av | 成人精品一区二区三区中文字幕 | 欧美1—12sexvideos | 亚洲精品一区二三区不卡 | 亚洲成人精品一区二区 | 国产目拍亚洲精品99久久精品 | 国产精品免费在线 | 国产精品美女久久久久久免费 | 久久精品一区二区三区四区 | 国产精品久久 | 97日日碰人人模人人澡分享吧 | 亚洲精品一区二区 | 国产分类视频 | 欧美日韩电影一区二区 | 国产精品日韩欧美一区二区 | 国产成人精品一区二 | 91av小视频 | 国产精品日日摸夜夜添夜夜av | 免费看国产片在线观看 | 成年人视频免费在线观看 | 中文字幕成人在线 | 天天干天天玩天天操 | 一区二区三区四区在线视频 | 国产精品1区2区3区 欧美 中文字幕 | 成人欧美一区二区三区白人 | 国产在线观看一区二区 | 精品亚洲永久免费精品 | 久久伊人操 | 一级片免费在线观看 | 777zyz色资源站在线观看 | 蜜桃在线一区二区三区 | 日韩av在线免费 | 亚洲精品久久久久久久不卡四虎 | 国产精产国品一二三产区视频 | 亚洲字幕在线观看 | 久久精品美女 | 欧美日韩成人网 | 国产精品一区二区三 |