2012-10-28 36 views
2

我正在尝试从Java应用程序恢复Mysql转储。 我使用这个代码:从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选项添加到命令从输入流读取它。它开始阅读,但随后再次挂起(和它不到风度读完命令的输出:它突然停止)

+1

如果您要在终端中运行该命令,mysql过程是否会在其操作完成后自行终止? –

+0

因为你关闭了所有的流,他们现在阻止了一切。阅读JavaDoc的'进程' –

+0

从终端,命令工作正常 – davidrgh

回答

0

好了,终于我改的程序,因为我无法解决这个问题。现在,我读取SQL文件,并用句子创建一个ArrayList,并由我自己执行。

感谢大家的支持。

1

的JavaDoc Process

创建的子进程没有自己的终端或安慰。所有 其标准io(即标准输入,标准输出,标准错误)操作将通过三个流 (getOutputStream(),getInputStream(),getErrorStream())重定向到父进程 。父进程 使用这些流向 子进程输入并获取输出。因为一些本地平台只提供有限的缓冲器大小 为标准输入和输出流,未能及时写 输入流或读出的子过程的输出流可能会导致 子进程来阻止,甚至死锁。

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

+0

我试图从他们读,但它没有工作 – davidrgh

+0

这是一个有点棘手,尝试读取和测试:https://www.securecoding.cert.org/confluence/display/java/FIO07-J.+ + +不+ +外部+进程+块+ + + IO +缓冲区,一般来说,如果可能的话,尝试使用ProcessBuilder:http://docs.oracle.com/javase/7/docs/api/java/lang /ProcessBuilder.html –

+0

tb;我试过了这个链接的例子(使用Runtime和ProcessBuilder),结果是一样的。 随着重定向溶液,例如,它停止在该行“C = is.read()” – davidrgh