代码之家  ›  专栏  ›  技术社区  ›  uneq95

超时时可运行任务内的JDBC ExecuteBatch行为

  •  2
  • uneq95  · 技术社区  · 6 年前

    我有一个 Runnable 使用执行批更新的任务 JDBC . 在主线程中,我创建了一个可运行任务的实例,并将其提交给 ExecutorService 这给了我一个 Future 对象。然后,我用get调用阻塞未来的对象,并指定30秒的超时。

    可运行任务的run()方法具有以下结构:

    PreparedStatement ps = dbConnection.preparedStatement("query");
    //loop and set the parameters and add to batch
    int[] updateResult = ps.executeBatch();
    

    从主线程,我访问这个 updateResult 数组,从可运行的任务实例中,查看更新成功的数据和失败的数据。

    现在,问题是,线程是否在执行仍在运行时超时 ps.executeBatch() 没有更新 更新数据 数组,数据库更改是回滚还是持久化?(我将auto-commit设置为true)如果数据库更改持续存在,我仍然会将updateResult数组设置为空,这通常意味着没有任何数据被持久化。所以,我的程序将把它视为失败,而不是失败。

    根据assylias的回答,我可以通过以下代码关闭任务:

    try{
        future.get(timeout, timeunit); 
    }catch(TimeoutException e){
        future.cancel(true);
    }
    

    有没有可能 ps.executeBatch()。 在可运行任务中,可能在主线程调用之前保留了数据库更改 future.cancel(true) ,何时由于超时而中断get调用?

    1 回复  |  直到 6 年前
        1
  •  1
  •   assylias    6 年前

    future.get(timeout, timeUnit) 将尝试在指定的时间内检索将来的结果。如果在超时结束时未来还没有完成, get 将引发异常。

    但底层任务不会停止。

    所以除非你取消任务, executeBatch 在超时后将保持正常运行。