一眼看過去相信大家都知道用runtime.getruntime().exec來呼叫,我的需求就是:
呼叫oracle exp命令完成備份,並返回生成的備份檔案名,這個備份檔案會很快在其他的地方被使用。
採用runtime.getruntime().exec我們都知道,需要處理它的inputstream,以避免出現執行的命令輸出的資訊過多使得程序被堵死,ok,按照這樣的方法,開寫:
=new
string[3];
="cmd"
;="/c"
;="exp username/password@sid file=***.dmp log=***.log";
process process
=runtime.getruntime().exec(cmds);
trycatch
(ioexception ioe)
寫完收工,執行,傻了,程序被掛s了,到底什麼原因呢,開始瞎嘗試,把讀取process的inputstream的部分全部去掉,執行,竟然ok,更暈,但這個時候出現了乙個問題,那就是沒法知道什麼時候備份檔案完全生成了,如果在runtime.getruntime後去獲取備份檔案,那個時候甚至連備份檔案都沒生成,之後甚至嘗試過輪詢直到備份檔案生成,再往下走,那樣還是有問題,就是生成的那個備份檔案永遠都只有正常的一半的大小,只有在整個程序退出的時候它才正常的全部生成。
竟然碰到這樣的問題,徹底暈,開始google,竟然只查到一篇和我這同樣的問題,更鬱悶的是那個帖子最後樓主寫了一句「問題解決了」,但沒寫是怎麼解決的,鬱悶s。
只好自己開始嘗試各種辦法,上網抓人到處問,最後在自己不斷的嘗試下終於是出現了轉機,在我的n+1次嘗試的時候我改為只讀取process的errorstream,然後執行,暈,ok了,在匯出成功的情況下沒有問題,但在匯出有錯誤的時候(像sid不對,使用者名稱錯誤,資料庫沒啟動等)程序還是被掛s,但只要匯出成功沒問題,匯出有錯誤的問題是很好處理的,ok,最後試驗的**改為這樣:
=new
string[3];
="cmd"
;="/c"
;=commandbuf.tostring();
process process
=runtime.getruntime().exec(cmds);
boolean
shouldclose
=false
;try
catch
(ioexception ioe)
if(shouldclose)
process.destroy();
intexitval
=process.waitfor();
當然,實際的**中不能像這裡寫的一樣,直接去判斷是否含錯誤這個字串,而且這段**是只適合在winnt版本以上的windows作業系統上執行的。
這樣反而可以了,說明什麼呢,說明在執行oracle的exp時,出現了乙個很怪的現象,就是exp在console輸出的資訊沒有被放入inputstream,反而是放到了errorstream中(即使正確的情況也是),這就導致了按照正常的情況去寫這段**的話反而會出問題。
擔心以後再次碰到這樣的問題,備忘一下....
oracle exp 用法例項
資料匯出 1 將資料庫test完全匯出,使用者名稱system 密碼manager 匯出到d daochu.dmp中 exp system manager test file d daochu.dmp full y 2 將資料庫中system使用者與sys使用者的表匯出 exp system man...
oracle exp 命令使用
匯出乙個完整資料庫 結構 資料 exp system password file u01 20101115.dmp log u01 20101115.log full y 只匯出資料庫的結構而不匯出裡面的資料 exp system password file u01 20101115.dmp log...
oracle exp匯出與imp匯入
通過exp匯出與imp匯入進行資料的備份轉移 exp命令 1exp username psw test file d test.dmp full y 2exp use rname psw test file d test.dmp owner ly 3exp username psw test fil...