Process.waitFor()在mysql备份期间永远等待

时间:2012-03-12 14:36:49

标签: java mysql mysqldump

我正在尝试使用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 个答案:

答案 0 :(得分:2)

您需要使用子流程的输出流。此article详细说明了成功使用Process所需的一切。 (而且,这已经在stackoverflow上已经多次回答了。)

答案 1 :(得分:1)

mysqldump转储到stdout。您可能希望将其读取为流,或使用选项-r重定向输出。