我有一个java代码,通过它我可以调用bat文件。这个bat文件包含对sqlldr的调用,它将来自txt文件的数据加载到表中(在oracle中)。 这是调用bat文件的java代码
ProcessBuilder pb = new ProcessBuilder(new File(".").getAbsolutePath()
+ File.separator + "ld.bat");
System.out.println("Before start");
Process start;
try {
start = pb.start();
} catch (IOException e) {
e.printStackTrace();
}
在此代码下面,我正在创建新线程并执行其他任务。数据加载在后台进行。我想在加载完成后做一些任务(例如将txt数据文件移动到另一个位置)。有没有办法在sqlldr完成数据加载后得到通知。
我遇到过一个解决方法 - 我可以继续检查d表中的行数,并将其与原始txt文件中的行数进行比较。但我想知道是否还有其他解决办法。
此外,我不想使用start.waitFor()
,因为这将使我的其他活动保持不变。
答案 0 :(得分:1)
我不确定我是否完全理解您的问题 - 您是否有理由不能将批处理脚本的调用放入新的线程中?
e.g。
new Thread("Load Data"){
@Override
public void run() {
// load data
// move txt data file
}
}.start();
// do other activities
// (Presumably they're not dependent on the data having been loaded...)
答案 1 :(得分:0)
我有同样的问题,并且这样解决了:
public void runSqlldr() throws IOException, Exception {
String sqlldrRunCmd = StartParserEngineHW3G2G.SQLLDRPATH
+ " userid='" + DBHelper.username + "/" + DBHelper.password + "@" + StartParserEngineHW3G2G.TNSNAME + "'"
+ " control='" + this.ctlFile.getAbsolutePath() + "'"
+ " log='" + this.logFile.getAbsolutePath() + "'"
+ " direct=true rows=1000000 errors=1000000000";
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(sqlldrRunCmd);
while(true){
if(logFile.exists() && logFile.length() > 0){
System.out.println(logFile + " is exist and sqlldr completed and lentgh is " + logFile.length());
proc.destroy();
break;
}
else{
System.out.println(logFile + " is not exist, and waiting and logfile length is " + logFile.length());
Thread.sleep(3000);
}
}
}
答案 2 :(得分:0)
这是已经过测试的确切解决方案。
当sqlldr启动时,下面的代码一直等到它结束,然后执行“some business”
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(sqlldrRunCmd);
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
// some business in here