2012-03-12 5 views
1

Process.waitFor()を使用してmysqldumpがバックアップ処理を終了するまで待機しようとしています。ここに私のコードです。Process.waitFor()はmysqlバックアップ中に永遠に待機します

///i use this mysql command, its working fine 
    String dump = "bkprefs/mysqldump " 
      + "--host=localhost "  
      + "--port=3306 " 
      + "--user=root " 
      + "--password= " 
      + "--add-drop-table " 
      + "--add-drop-database " 
      + "--complete-insert " 
      + "--extended-insert " 
      + "test"; 
    //execute the command 
    Process run = null; 
    try { 
     run = Runtime.getRuntime().exec(dump); 
     int stat = run.waitFor(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

問題は、run.waitfor()がハングすることです。それは起こらない何かを待っているようです。

int stat = run.waitFor()Thread.sleep(5)に置き換えると、バックアップが正常に動作しています。しかし、私はこれに固執することはできません。なぜならバックアップ時間はデータベースのサイズによって異なるため、バックアップ処理が完了するのを待つのにThread.sleepを使用するのは安全ではありません。

私を助けてください。返信は大歓迎です。

編集:

次のコードを使用して入力ストリームを消費します。

InputStream in = run.getInputStream(); 
    FileWriter fstream = null; 
    try { 
     fstream = new FileWriter("haha.sql"); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
    BufferedWriter out = new BufferedWriter(fstream); 

    int nextChar; 
    StringBuffer sb = new StringBuffer(); 
    try { 
     while ((nextChar = in.read()) != -1) { 
      out.write((char) nextChar); 
      //sb.append((char) nextChar); 
     } 
     out.flush(); 
     out.close(); 

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

答えて

2

サブプロセスからの出力ストリームを消費する必要があります。このarticleには、Processをうまく使用するために必要なことがすべて記載されています。 (これはおそらくstackoverflowですでに何回も答えられているでしょう)。

+0

ちょうど私が投稿したコードに続くコードは、 – Jemp

+0

@Bnrdoの - あなたはこれらのストリームを処理するために_分離スレッドを使用していますか? – jtahlborn

+0

いいえ、これらのストリームを処理するコードは文字通りバックアップコードに従います。 – Jemp

1

mysqldump標準出力にダンプします。ストリームを読むか、出力をリダイレクトするオプション-rを使用します。

+0

ご返信ありがとうございます。私は自分の投稿を編集したので、私はストリームを読んだので、それは私の質問には問題ではないと思う。 – Jemp

関連する問題