• 締切済み

ProcessBuilderの使い方

ProcessBuilderを使用してMysqlのコマンド(Select文、Create文)を実行することはできないか と思い下記サンプルを作ってみました。まづはmysqlを起動するコマンドを実行してみました。 Eclipse上で実行してみたのですが p.waitFor(); の部分で応答が返ってこなくなります。 何か使い方が間違っていますでしょうか。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ProcessBuilderTest { public static void main(String[] args) { ProcessBuilder pb = new ProcessBuilder("mysql", "-u", "root", "-p", "root"); try { Process p = pb.start(); // ping が完了するのを待つ p.waitFor(); // 実行結果を取得するストリームの種別を出力 System.out.println(pb.redirectInput()); try (BufferedReader br = new BufferedReader( new InputStreamReader(p.getInputStream()))) { // ping結果の出力 for(String line = br.readLine(); line != null; line = br.readLine()) { System.out.println(line); } } } catch (IOException | InterruptedException e) { // 例外ハンドリング処理 } } }

みんなの回答

noname#212058
noname#212058
回答No.5

回答No.1 です。 > 結果は何も表示されず (以下略) コマンドプロンプトも返ってこないということでしょうか。そうならば、接続先かユーザ・パスワードが間違っていろと思いますね。今回の引数では接続先(ホスト名)が省略されているので、localhost (コマンドを実行しているパソコン自身) に接続しようとしていると思いますが、接続先それで合っていますか?

noname#212058
noname#212058
回答No.4

回答No.1 です。 SQL を " で囲む必要があるかもしれませんね。 ProcessBuilder("mysql", "-u”, "root", "-proot", "-e", "\"insert into testDB.test(num, name) values(6, 'test6')\""); これでダメなら、問題のコマンドをコマンドプロンプトでSQLを実行されることをお勧めします。まずはコマンドプロンプトならばダイレクトにエラーが判りますので、これで動くことを確認してから、ProcessBuilder に適用したほうが良いです。コマンドプロンプトで以下のコマンドを叩くとどうなるでしょうか。 mysql -u root -proot -e "insert into testDB.test(num, name) values(6, 'test6')"

unko347
質問者

お礼

その後、自宅の環境(MySQL5.5)ではうまくいかなかったのに 職場の環境(MySQL5.6)上ではコマンドプロンプト上でコマンドをたたくと 実行できることがわかりました。Javaプログラム上からも職場環境では うまく行きました。

unko347
質問者

補足

ご回答ありがとうございます。 うまくいきませんでしたのでコマンドプロンプトで直接 mysql -u root -proot -e "insert into testDB.test(num, name) values(6, 'test6')" を実行してみました。 結果は何も表示されずテーブルにレコードは追加されませんでした。

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.3

 こんにちは  p.waitFor()は、ない方がよくないですか?  なくせば、少なくとも、どこまで進んでいるかはわかると思うのですが

unko347
質問者

補足

ご回答ありがとうございます。 ご指摘の箇所コメント化したところ何も表示されませんでしたので 恐らく何も処理が進んでいないものと思われます。

noname#212058
noname#212058
回答No.2

回答No.1 です。 > ProcessBuilder("mysql", "-uroot", "-proot", "insert into testDB.test(num, name) values(6, 'test6')"); 引数の与え方が違うように思います。以下のようになるのでは。 ProcessBuilder("mysql", "-u”, "root", "-proot", "-e", "insert into testDB.test(num, name) values(6, 'test6')");

unko347
質問者

補足

ご回答ありがとうございます。 ご教授頂いたコマンドで試してみたのですがテーブルにデータは追加されませんでした。 Eclipseのコンソールにはプログラム終了後「PIPE」という文字列が表示されます。

noname#212058
noname#212058
回答No.1

接続先データベースは、ユーザ・パスワードを入力しなくても接続できるのでしょうか? mysql がユーザの入力待ちになって停止しているように思いますが。

unko347
質問者

補足

ご回答ありがとうございます。 ユーザー、パスワードを入力しないとMySQLには接続できないようになっています。 入力待ちになっているのかと思い ProcessBuilder pb = new ProcessBuilder("mysql", "-uroot", "-proot", "insert into testDB.test(num, name) values(6, 'test6')"); というコマンドを発行してみた後、実際にテーブルにレコードが追加されているか 確認してみたところ追加されていなかったのでうまく動作していないようです。 Eclipseのコンソールにはプログラム終了後「PIPE」という文字列が表示されます。

関連するQ&A