2011-05-03 121 views
0

我使用process = Runtime.getRuntime().exec(cmd,null,new File(path)); 以執行文件中的一些SQL(abz.sql)問題與運行調用Runtime.getRuntime(時)EXEC

命令是:

"sqlplus "+ context.getDatabaseUser()  + "/" 
      + context.getDatabasePassword() + "@" 
      + context.getDatabaseHost()  + ":" 
      + context.getDatabasePort()  + "/" 
      + context.getSid()    + " @" 
      + "\"" 
      + script + "\""; 

String path=context.getReleasePath()+ "/Server/DB Scripts"; 

據執行該文件,但沒有退出。因此我嘗試使用:

Writer out = new OutputStreamWriter(process.getOutputStream()); 
out.append("commit;\r\n"); 
out.append("exit \r\n"); 
System.out.println("---------"+out); 
out.close(); 

此它完整塊我米使用:

if(context.getConnectionField()=="ORACLE") 
{ 

    String cmd= 
    "sqlplus "+ context.getDatabaseUser()  + "/" 
       + context.getDatabasePassword() + "@" 
       + context.getDatabaseHost()  + ":" 
       + context.getDatabasePort()  + "/" 
       + context.getSid()    + " @" 
       + "\"" 
       + script +"\""; 

    String path=context.getReleasePath()+ "/Server/DB Scripts"; 
    process = Runtime.getRuntime().exec(cmd,null,new File(path)); 
    out = new OutputStreamWriter(process.getOutputStream()); 
    out.append("commit;\r\n"); 
    out.append("exit \r\n"); 
    System.out.println("---------"+out); 
    out.close();  

     Integer result1 = null; 
    while (result1 == null) { 
     try { 
      result1 = process.waitFor(); 
    } 
      catch (InterruptedException e) {} 
    } 

    if(process.exitValue() != 0) 
      return false; 
     return true; 
} 
+1

如果您認真對待此問題,請考慮其他人如何閱讀您的問題;你的問題格式不好,很難爲其他人閱讀。通常,這會導致低質量的答案或根本沒有答案。如果你想正確回答你的問題,請嘗試寫下你的問題:) – 2011-05-03 14:38:15

+0

它以什麼方式不起作用?你沒有得到你期望的結果,或者你是否遇到異常情況等? – karakuricoder 2011-05-03 14:43:06

回答

1

所示的代碼無法讀取Process的錯誤流。這可能會阻礙進展。 ProcessBuilder是在Java 1.5中引入的,並且有一個方便的方法來訪問redirectErrorStream() - 因此只需要使用單個流。

有關更多一般技巧,請閱讀&實施When Runtime.exec() won't的所有建議。

+1

不僅錯誤,也是輸出流。 – krico 2011-05-03 20:53:11

+0

@krico:是的。我實際上認爲OP是這樣做的,但由於'out.close()'發生在'process.waitFor()'之前,'OutputStream'沒有被正確地使用。 – 2011-05-03 21:46:21

0

我可以在這裏看到一些問題。您正在使用的'exec'版本將使用StringTokenizer對命令字符串進行標記,因此密碼中的不常用字符(如空格)或其他替代參數將等待發生。我建議切換到版本

過程EXEC(的String [] cmdarray, 的String [] envp, 文件目錄) 拋出IOException異常

它是更多的工作使用,但更健壯。

第二個問題是關於exec是否會與Java進程同時運行(參見http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html)有各種警告。所以你需要說出你正在使用哪種操作系統。如果它不同時運行,那麼寫入輸出流的策略將無法工作!

程序的最後一位寫得比較模糊。我建議......

for (;;) { 
    try { 
     process.waitFor(); 
     return process.exitValue() == 0; 
    } catch (InterruptedException _) { 
     System.out.println("INTERRUPTED!"); // Debug only. 
    } 
} 

這消除了多餘的變量RESULT1,消除了多餘的拳擊和突出無限循環的一個可能的原因。

希望這會有所幫助&祝你好運!

相關問題