2011-05-03 3 views
0

process = Runtime.getRuntime().exec(cmd,null,new File(path)); 을 사용하여 파일 (abz.sql)에서 일부 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

심각한 문제인 경우 다른 사람들이 내 질문을 읽는 방법을 고려하십시오. 귀하의 질문은 형식이 잘못되었고 다른 사람들을 위해 매우 열심히 읽습니다. 일반적으로 이것은 낮은 품질의 답변 또는 전혀 응답하지 않습니다. 질문에 대한 적절한 대답을 원하면 그에 대한 질문을 작성하십시오. –

+0

어떤 방식으로 작동하지 않습니까? 예상 한 결과를 얻지 못했거나 예외가 발생하고 있습니까? – karakuricoder

답변

1

나타내는 코드 Process의 에러 스트림을 판독하지 못한다. 그건 진전을 막을 수 있습니다. ProcessBuilder은 Java 1.5에 도입되었으며 편리한 방법이 redirectErrorStream()입니다. 따라서 단일 스트림 만 사용하면됩니다.

더 일반적인 팁을 보려면 &을 읽고 When Runtime.exec() won't의 모든 권장 사항을 구현하십시오.

+1

오류뿐만 아니라 출력 스트림. – krico

+0

@krico : 예. 나는 실제로 OP가 그렇게하고 있다고 생각했지만,'out.close()'가'process.waitFor()'전에 발생했기 때문에,'OutputStream'은 제대로 소비되지 않았습니다. –

0

여기에 몇 가지 문제가 있습니다. 사용중인 'exec'버전은 StringTokenizer를 사용하여 명령 문자열을 토큰 화하므로 패스워드 (공백과 같은) 또는 대체되는 다른 매개 변수의 비정상적인 문자는 대기중인 사고입니다. 나는 버전으로

프로세스 간부를 전환하는 것이 좋습니다 (문자열 [] cmdarray 인수, 는 [] 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. 
    } 
} 

이, 불필요한 변수 결과 1을 제거 불필요한 복싱을 제거하고 무한 루프의 원인을 강조 ... 좋습니다.

희망이 도움이 & 행운을 빕니다!

관련 문제