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サービスが正常に機能しなくなります(再起動する必要があります)。私はたくさんのコードを試しました:ストリームを閉じる、それを読む...しかし同じ結果になりました。

ヒントはありますか?

私の英語があまり上手でないならすみません。

ありがとう

追伸:inputstreamから読み取るために、コマンドに-vオプションを追加しようとしました。読み取りを開始しますが、再びハングします(コマンドの出力の読み取りが終了しません:突然停止します)

4

2 に答える 2

1

JavaDoc for Process

作成されたサブプロセスには、独自のターミナルまたはコンソールがありません。そのすべての標準io(つまり、stdin、stdout、stderr)操作は、3つのストリーム(getOutputStream()、getInputStream()、getErrorStream())を介して親プロセスにリダイレクトされます。親プロセスは、これらのストリームを使用して、サブプロセスに入力を供給し、サブプロセスから出力を取得します。一部のネイティブプラットフォームでは、標準の入力ストリームと出力ストリームに限られたバッファサイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りに失敗すると、サブプロセスがブロックされ、デッドロックが発生する可能性があります。

これらのストリームを閉じるのではなく、これらのストリームから読み取る必要があります。

于 2012-10-29T00:00:52.673 に答える
0

さて、この問題を解決できなかったので、ようやく手順を変更しました。ここで、SQLファイルを読み取り、文を使用してArrayListを作成し、自分で実行します。

皆様のご支援に感謝いたします。

于 2012-11-02T09:21:44.853 に答える