Java sqlloader完成数据加载时收到通知

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

我有一个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");
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