我正在使用process = Runtime.getRuntime().exec(cmd,null,new File(path));
在文件中执行一些SQL(abz.sql)
命令是:
"sqlplus "+ context.getDatabaseUser() + "/"
+ context.getDatabasePassword() + "@"
+ context.getDatabaseHost() + ":"
+ context.getDatabasePort() + "/"
+ context.getSid() + " @"
+ "\""
+ script + "\"";
String path=context.getReleasePath()+ "/Server/DB Scripts";
它正在执行该文件但没有退出。因此我尝试使用:
Writer out = new OutputStreamWriter(process.getOutputStream());
out.append("commit;\r\n");
out.append("exit \r\n");
System.out.println("---------"+out);
out.close();
这是我使用的完整块:
if(context.getConnectionField()=="ORACLE")
{
String cmd=
"sqlplus "+ context.getDatabaseUser() + "/"
+ context.getDatabasePassword() + "@"
+ context.getDatabaseHost() + ":"
+ context.getDatabasePort() + "/"
+ context.getSid() + " @"
+ "\""
+ script +"\"";
String path=context.getReleasePath()+ "/Server/DB Scripts";
process = Runtime.getRuntime().exec(cmd,null,new File(path));
out = new OutputStreamWriter(process.getOutputStream());
out.append("commit;\r\n");
out.append("exit \r\n");
System.out.println("---------"+out);
out.close();
Integer result1 = null;
while (result1 == null) {
try {
result1 = process.waitFor();
}
catch (InterruptedException e) {}
}
if(process.exitValue() != 0)
return false;
return true;
}
答案 0 :(得分:1)
显示的代码无法读取Process
的错误流。这可能阻碍了进步。 ProcessBuilder
是在Java 1.5中引入的,并且为redirectErrorStream()
提供了一个方便的方法 - 因此只需要使用单个流。
有关更多一般提示,请阅读&实施When Runtime.exec() won't的所有建议。
答案 1 :(得分:0)
我在这里可以看到一些问题。您正在使用的'exec'版本将使用StringTokenizer对命令字符串进行标记,因此密码中的异常字符(如空格)或其他被替换的参数是等待发生的事故。我建议切换到版本
进程exec(String [] cmdarray, String [] envp, 文件目录) 抛出IOException
使用它需要更多工作,但更强大。
第二个问题是关于exec是否与Java进程同时运行有各种警告(参见http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html)。所以你需要说出你所使用的操作系统。如果它不同时运行,那么写入输出流的策略就不起作用了!
程序的最后一点写得相当模糊。我建议......
for (;;) {
try {
process.waitFor();
return process.exitValue() == 0;
} catch ( InterruptedException _ ) {
System.out.println( "INTERRUPTED!" ); // Debug only.
}
}
这消除了多余的变量result1,消除了多余的拳击并突出了无限循环的可能原因。
希望这会有所帮助&祝你好运!