1

これが私のコードです

try{   
String logf = "mysql -p -h localhost ruralcdn<E:\\data\\DBServer\\"+FileName;
System.out.println("Command"+logf);
Runtime rt = Runtime.getRuntime();

Process pr = rt.exec(logf); 
int lm = pr.waitFor();
System.out.println("lm"+lm);

System.out.println("!!Done!!");
}catch(Exception ex){
System.out.println("!!error!!");                

}

上記のコードをコンパイルすると、無限の時間ハングし、データベースのエントリが更新されません。以下の方法で試してみたところ

Connection conn = dbConnectionSource.getConnection();
Statement stmt = conn.createStatement();
stmt.execute(FileUtils.readFileToString(new File("./some-sql-file")));

コンソールにエラーが表示されました:SQLシンテックスにエラーがあります

私が正しく物事を行うことができるように私を助けてください。

ありがとう-A

4

1 に答える 1

4

コマンド (in logf) には、標準入力のリダイレクトが含まれています。残念ながら、Process.exec(String)メソッドはコマンドのリダイレクト、引用、sso の実行方法を理解していないため、そのようにすることはできません。スペースで区切られた引数を使用して単純なコマンドを実行する方法のみを理解します。

次の 2 つの選択肢があります。

  • Java でファイルを開き、それをプロセス オブジェクトの出力ストリームに書き込んで、コマンドの標準入力に表示することができます。

  • mysqlリダイレクトなどを処理できるシェル/コマンドインタープリターでコマンドを実行するように Java に指示できます。


コードは次のようになります。

String[] command = new String{
        "cmd",
        "/c",
        "mysql -p -h localhost ruralcdn < E:\\data\\DBServer\\" + fileName;

ProcessBuilder pb = new ProcessBuilder(command);
Process p = pb.start();
p.waitFor();

コードで行うべきもう 1 つのことは、コマンドからの標準出力/エラーを読み取って表示 (または破棄) することです。読まない場合:

  • エラーメッセージが含まれているかどうかはわかりません。
  • mysql読み取っていないパイプにこれ以上書き込むことができないため、コマンドがブロックされる可能性があります。

コンソールにエラーが表示されました: SQL 構文にエラーがあります

それはおそらく真実を語っている...


ところで、mysqlコマンドが現在永久にハングする理由は、Java プロセスが標準入力でデータを送信するのを待っているためです。Java コードは何も書き込まないため、それは起こりません。

于 2012-05-05T14:59:09.397 に答える