我正在尝试从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选项以从输入流中读取它。它开始读取,但然后它再次挂起(它没有完成读取命令的输出:它突然停止)
答案 0 :(得分:1)
Process
的JavaDoc:
创建的子流程没有自己的终端或控制台。所有 它的标准io(即stdin,stdout,stderr)操作将是 通过三个流重定向到父进程 (getOutputStream(),getInputStream(),getErrorStream())。父母 进程使用这些流来输入和从中获取输出 子。因为某些本机平台仅提供有限的缓冲区 标准输入和输出流的大小,无法及时写入 输入流或读取子进程的输出流可能会导致 要阻止的子进程,甚至是死锁。
您需要从这些流中读取,而不是关闭它们。
答案 1 :(得分:0)
好吧,最后我改变了程序,因为我无法解决这个问题。现在,我读了SQL文件,然后用句子创建了一个ArrayList,我自己执行它们。
感谢大家的支持。