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

时间:2012-05-25 06:41:04

标签: java oracle10g sql-loader

我有一个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(),因为这将使我的其他活动保持不变。

3 个答案:

答案 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