0

我有一个 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() ,因为这会使我的其他活动暂停。

4

3 回答 3

1

我不确定我是否完全理解您的问题-您是否有任何理由不能将批处理脚本的调用放入新线程中?

例如

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...)
于 2012-05-25T08:23:37.933 回答
0

这是确切的解决方案,已经过测试。

当 sqlldr 启动时,下面的代码等到它结束,然后执行“一些业务”

    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(sqlldrRunCmd);
    int exitVal = proc.waitFor();
    System.out.println("Process exitValue: " + exitVal);

    // some business in here
于 2013-10-05T23:32:53.173 回答
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);
        }

    }
}
于 2013-10-05T22:25:10.393 回答