免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

一眼看過去相信大家都知道用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ù)
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java列出 Windows 下當(dāng)前運(yùn)行的所有進(jìn)程
Java在windows上操作常用程序、系統(tǒng)命令的技巧
Android 中網(wǎng)絡(luò)連接檢測(cè)和使用ping檢測(cè)網(wǎng)絡(luò)是否可訪問
JAVA如何調(diào)用DOS命令
java程序中調(diào)用linux命令
java代碼實(shí)現(xiàn)開啟openoffice服務(wù)和關(guān)閉sffice.exe進(jìn)程
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服