Java sqlloader完成数据加载时收到通知
我有一个java代码,通过它调用bat文件。此bat文件包含对sqlldr的调用,sqlldr将数据从txt文件加载到表中(在oracle中)。 这是调用bat文件的java代码Java sqlloader完成数据加载时收到通知,java,oracle10g,sql-loader,Java,Oracle10g,Sql Loader,我有一个java代码,通过它调用bat文件。此bat文件包含对sqlldr的调用,sqlldr将数据从txt文件加载到表中(在oracle中)。 这是调用bat文件的java代码 ProcessBuilder pb = new ProcessBuilder(new File(".").getAbsolutePath() + File.separator + "ld.bat"); System.out.println("Before start");
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()
,因为这会使我的其他活动暂停。我不确定我是否完全理解您的问题-您有什么理由不能将批处理脚本的调用放入新线程中
e、 g
我也有同样的问题,解决方法如下:
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);
}
}
}
这是已经测试过的精确解决方案 当sqlldr启动时,下面的代码等待它结束,然后执行“somebusiness”
我创建了一个新线程,但现在当我给出start.waitFor()时,它在插入384行之后一直在等待。该文件包含996行。只有在我停止JVM之后,所有剩余的行才会被插入。@dilip-我假设您正在每行进行一次插入。您应该对其进行批处理,这样您将获得更好的性能,并且它将作为单个事务工作。e、 g.
插入表(列…)值(第1行)、(第2行)、(第3行)
我的批处理脚本包含sqlldr命令。ie sqlldr username/password control=control_file.ctl,并且控制文件包含基本加载数据命令。正如我在问题中提到的,这个答案对我没有帮助,我不想使用waitFor(),因为它还有其他缺点。
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);
}
}
}
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(sqlldrRunCmd);
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
// some business in here