Process.waitFor () ждет вечно во время резервного копирования MySQL - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь использовать Process.waitFor (), чтобы дождаться, пока mysqldump завершит процесс резервного копирования. Вот мой код.

    ///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 ]

2 голосов
/ 12 марта 2012

вам нужно использовать выходные потоки из подпроцесса.Эта статья подробно описывает все, что вам нужно сделать, чтобы успешно использовать Process.(также, вероятно, уже много раз отвечали на stackoverflow).

1 голос
/ 12 марта 2012

mysqldump дамп на стандартный вывод.Возможно, вы захотите прочитать его в потоке или использовать параметр -r, перенаправляющий вывод.

...