一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

java調(diào)用Oracle EXP備忘 - BlueDavy之技術(shù)Blog - BlogJa...

 nbtymm 2006-11-24

一眼看過去相信大家都知道用Runtime.getRuntime().exec來調(diào)用,我的需求就是:
調(diào)用Oracle EXP命令完成備份,并返回生成的備份文件名,這個(gè)備份文件會(huì)很快在其他的地方被使用。
采用Runtime.getRuntime().exec我們都知道,需要處理它的InputStream,以避免出現(xiàn)執(zhí)行的命令輸出的信息過多使得進(jìn)程被堵死,OK,按照這樣的方法,開寫:

String[] cmds  =   new  String[ 3 ];
cmds[
0 =   " cmd " ;
cmds[
1 =   " /C " ;
cmds[
2 ] = "exp username/password@sid file=xxx.dmp log=xxx.log";
    Process process
= Runtime.getRuntime().exec(cmds);
        
try   {
            InputStreamReader isr 
=   new  InputStreamReader(process.getInputStream());
            BufferedReader br 
=   new  BufferedReader(isr);
            String line 
=   null ;
            
while  ((line  =  br.readLine())  !=   null ) {
                System.out.println(line);            
                   }

        }
 
        
catch  (IOException ioe)  {
                ioe.printStackTrace();

        }
寫完收工,執(zhí)行,傻了,進(jìn)程被掛S了,到底什么原因呢,開始瞎嘗試,把讀取process的InputStream的部分全部去掉,執(zhí)行,竟然OK,更暈,但這個(gè)時(shí)候出現(xiàn)了一個(gè)問題,那就是沒法知道什么時(shí)候備份文件完全生成了,如果在Runtime.getRuntime后去獲取備份文件,那個(gè)時(shí)候甚至連備份文件都沒生成,之后甚至嘗試過輪詢直到備份文件生成,再往下走,那樣還是有問題,就是生成的那個(gè)備份文件永遠(yuǎn)都只有正常的一半的大小,只有在整個(gè)進(jìn)程退出的時(shí)候它才正常的全部生成。
竟然碰到這樣的問題,徹底暈,開始google,竟然只查到一篇和我這同樣的問題,更郁悶的是那個(gè)帖子最后樓主寫了一句“問題解決了”,但沒寫是怎么解決的,郁悶S。
只好自己開始嘗試各種辦法,上網(wǎng)抓人到處問,最后在自己不斷的嘗試下終于是出現(xiàn)了轉(zhuǎn)機(jī),在我的N+1次嘗試的時(shí)候我改為只讀取process的ErrorStream,然后執(zhí)行,暈,OK了,在導(dǎo)出成功的情況下沒有問題,但在導(dǎo)出有錯(cuò)誤的時(shí)候(像sid不對(duì),用戶名錯(cuò)誤,數(shù)據(jù)庫沒啟動(dòng)等)進(jìn)程還是被掛S,但只要導(dǎo)出成功沒問題,導(dǎo)出有錯(cuò)誤的問題是很好處理的,OK,最后試驗(yàn)的代碼改為這樣:
String[] cmds = new String[3];
        cmds[
0= "cmd";
        cmds[
1= "/C";
        cmds[
2]=commandBuf.toString();
        Process process
=Runtime.getRuntime().exec(cmds);
        
boolean shouldClose=false;
        
try {
            InputStreamReader isr 
= new InputStreamReader(process.getErrorStream());
            BufferedReader br 
= new BufferedReader(isr);
            String line 
= null;
            
while ((line = br.readLine()) != null){
                
if(line.indexOf("錯(cuò)誤")!=-1){
                    shouldClose
=true;
                    
break;
                }

            }

        }
 
        
catch (IOException ioe) {
            shouldClose
=true;
        }

        
if(shouldClose)
            process.destroy();
        
int exitVal = process.waitFor();
當(dāng)然,實(shí)際的代碼中不能像這里寫的一樣,直接去判斷是否含錯(cuò)誤這個(gè)字符串,而且這段代碼是只適合在winnt版本以上的windows操作系統(tǒng)上執(zhí)行的。
這樣反而可以了,說明什么呢,說明在執(zhí)行oracle的exp時(shí),出現(xiàn)了一個(gè)很怪的現(xiàn)象,就是exp在console輸出的信息沒有被放入InputStream,反而是放到了ErrorStream中(即使正確的情況也是),這就導(dǎo)致了按照正常的情況去寫這段代碼的話反而會(huì)出問題。

擔(dān)心以后再次碰到這樣的問題,備忘一下....
posted on 2006-11-22 22:43 BlueDavy 閱讀(424) 評(píng)論(2)  編輯 收藏 引用 收藏至365Key 所屬分類: Java

評(píng)論

# re: java調(diào)用Oracle EXP備忘 2006-11-23 13:09 javabeginer
從沒寫過有關(guān)process的東西,學(xué)習(xí)!  回復(fù)
  

# re: java調(diào)用Oracle EXP備忘 2006-11-24 14:38 kruce[匿名]
正如你所說的,處理Process的時(shí)候要注意及時(shí)讀取子進(jìn)程的輸出流,不然可能導(dǎo)致子進(jìn)程堵塞,甚至死鎖。
如果我是你,我會(huì)這么來排除bug。
1,把對(duì)InputStream的處理放到一個(gè)單獨(dú)Thread里面。
2,用ProcessBuilder的redirectErrorStream來合并OutputStream和ErrorStream。注意子進(jìn)程的InputStream對(duì)應(yīng)父進(jìn)程的OutStream。如果不合并這兩個(gè)流的話則必須并行排空它們,順序的排空會(huì)導(dǎo)致思索。
建議你好好看看5.0的API和JLS。  回復(fù)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多

    操白丝女孩在线观看免费高清| 亚洲高清中文字幕一区二三区| 欧美一区二区三区性视频| 国产精品成人免费精品自在线观看 | 国产午夜福利在线免费观看| 亚洲欧美国产网爆精品| 国产精品福利一二三区| 青青操视频在线播放免费| 精品国产av一区二区三区不卡蜜| 麻豆国产精品一区二区三区| 欧美一级内射一色桃子 | 日韩和欧美的一区二区三区| 久久99精品日韩人妻| 熟女高潮一区二区三区| 成人午夜在线视频观看| 91精品欧美综合在ⅹ| 内射精品欧美一区二区三区久久久| 亚洲国产av国产av| 日韩特级黄片免费观看| 男人操女人下面国产剧情| 欧美一区日韩一区日韩一区| 美日韩一区二区精品系列| 欧美国产日本高清在线| 久久这里只精品免费福利| 成年午夜在线免费视频| 日韩成人动画在线观看| 国产精品一区二区日韩新区| 激情丁香激情五月婷婷| 日本人妻免费一区二区三区| 国内女人精品一区二区三区| 国产欧美日韩精品自拍 | 国产一级内片内射免费看| 欧美日韩无卡一区二区| 久久大香蕉精品在线观看| 五月情婷婷综合激情综合狠狠| 在线免费视频你懂的观看| 久久精品久久精品中文字幕| 日韩欧美三级视频在线| 亚洲熟妇熟女久久精品| 老司机精品福利视频在线播放| 精品国自产拍天天青青草原 |