我写了一个简单的oracle的备份系统,需要调用expdp和impdp命令。结果发现
int exitCode = Runtime.getRuntime().exec(cmd).waitFor();
if(0 == exitCode){
// success
}else{
//failure
}
这样书写代码之后,晚上执行几千个表的备份的时候,有个数不定的expdp或impdp进程被挂死,不退出。
后来我发现很多人都遇到了类似的问题。解决方法如下:
http://blog.csdn.net/rogerjava/article/details/7006987
http://dhruba.name/2012/10/16/java-pitfall-how-to-prevent-runtime-getruntime-exec-from-hanging/
- public class TESTRuntime {
- public String cmdexeStr = "exp test/test file=d:/daochu.dmp tables=(t_test)";
- public String startRunTime(){
- try {
- Process proc = Runtime.getRuntime().exec(cmdexeStr);
- InputStream errorProcStream = proc.getErrorStream();
- InputStream outputProcStream = proc.getInputStream();
- InputStreamReader errorRead = new InputStreamReader(errorProcStream);
- InputStreamReader outputRead = new InputStreamReader(outputProcStream);
- BufferedReader errorbr = new BufferedReader(errorRead);
- String errorline = null;
- while ((errorline = errorbr.readLine()) != null) {
- System.out.println("------error:/n"+errorline);
- }
- BufferedReader outputbr = new BufferedReader(outputRead);
- String outputline = null;
- while ((outputline = outputbr.readLine()) != null) {
- System.out.println("------debug:/n"+outputline);
- }
- int num = proc.waitFor();
- System.out.println("------num:"+num);
- proc.destroy();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
- public static void main(String[] args) {
- System.out.println("------------start run--------------");
- TESTRuntime test = new TESTRuntime();
- test.startRunTime();
- System.out.println("------------end run--------------");
- }
- }