从java恢复Mysql转储:为什么它会挂起进程?

时间:2012-10-28 23:54:07

标签: java mysql process runtime dump

我正在尝试从Java应用程序恢复Mysql转储。 我正在使用此代码:

    Runtime rt = Runtime.getRuntime();
                try {
                   comando = "mysql -u root -ppass -e \"source " + path + "\\sql\\backup.sql\" legapelis" ; 

                   Process proceso = rt.exec(comando);
                   System.out.println("ejecutando");
                   System.out.println(comando);


                   proceso.getInputStream().close();
                   proceso.getOutputStream().close();
                   proceso.getErrorStream().close();


                   completado = proceso.waitFor();
                   if (completado != 0) {
                       System.out.println("error");
                       addActionError(getText("backup.errcopia") + ": " + String.valueOf(completado));
                       consultarCopias();
                       return "error";
                   }
                   System.out.println("fin");


                } catch (Exception e) {
                    addActionError(e.getLocalizedMessage());
                    consultarCopias();
                    return "error";
                }

但是此代码打开的Mysql进程永远不会结束。它挂起,如果我杀了它,Mysql服务停止工作正常(我必须重新启动它)。我已经尝试了很多代码:关闭流,阅读它......但结果相同。

任何提示?

打扰一下,如果我的英语不太好。

感谢的

Ps:我试图在命令中添加-v选项以从输入流中读取它。它开始读取,但然后它再次挂起(它没有完成读取命令的输出:它突然停止)

2 个答案:

答案 0 :(得分:1)

Process的JavaDoc:

  

创建的子流程没有自己的终端或控制台。所有   它的标准io(即stdin,stdout,stderr)操作将是   通过三个流重定向到父进程   (getOutputStream(),getInputStream(),getErrorStream())。父母   进程使用这些流来输入和从中获取输出   子。因为某些本机平台仅提供有限的缓冲区   标准输入和输出流的大小,无法及时写入   输入流或读取子进程的输出流可能会导致   要阻止的子进程,甚至是死锁。

您需要从这些流中读取,而不是关闭它们。

答案 1 :(得分:0)

好吧,最后我改变了程序,因为我无法解决这个问题。现在,我读了SQL文件,然后用句子创建了一个ArrayList,我自己执行它们。

感谢大家的支持。