2

我正在尝试从 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 选项添加到命令中以从输入流中读取它。它开始读取但随后又挂起(并且它没有完成读取命令的输出:它突然停止)

4

2 回答 2

1

JavaDoc 用于Process

创建的子进程没有自己的终端或控制台。它所有的标准io(即stdin、stdout、stderr)操作都会通过三个流(getOutputStream()、getInputStream()、getErrorStream())重定向到父进程。父进程使用这些流向子进程提供输入并从子进程获取输出。由于部分原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。

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

于 2012-10-29T00:00:52.673 回答
0

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

谢谢大家的支持。

于 2012-11-02T09:21:44.853 回答