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 语法有错误

请帮助我,以便我可以正确地做事。

谢谢

4

1 回答 1

4

您的命令 (in logf) 包括标准输入的重定向。不幸的是,您不能那样做,因为该Process.exec(String)方法不了解如何进行命令重定向、引用和 sso on。它只了解如何执行带有空格分隔的参数的简单命令。

你有两个选择:

  • 您可以在 Java 中打开该文件,并将其写入进程对象的输出流,以便它显示在命令标准输入中。

  • 您可以告诉 Javamysql在可以处理重定向等的 shell / 命令解释器中运行命令。


您的代码应如下所示:

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();

您的代码应该做的另一件事是从命令中读取并显示(或丢弃)标准输出/错误。如果你不读它:

  • 您将不知道它是否包含任何错误消息,并且
  • mysql命令可能会阻塞,因为它无法再向您未读取的管道写入任何内容。

控制台显示错误:您的 sql 语法有错误

大概说的是实话……


顺便说一句,mysql命令当前永远挂起的原因是它正在等待 Java 进程在其标准输入上向它发送数据。这不会发生,因为您的 Java 代码没有向其写入任何内容。

于 2012-05-05T14:59:09.397 回答