我有一个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()
上执行时线程超时,并且没有更新updateResult
数组,数据库更改是否会回滚或保留? (我将auto-commit设置为true),如果数据库更改仍然存在,我仍然将updateResult数组设置为null,这通常意味着没有任何数据被保留。因此,如果不是这样,我的程序会将其视为失败。根据assylias的回答,我可以通过以下代码关闭任务:
try{
future.get(timeout, timeunit);
}catch(TimeoutException e){
future.cancel(true);
}
当get调用由于超时而中断时,可运行任务中的
ps.executeBatch()
是否可能在主线程调用future.cancel(true)
之前持久化了数据库更改? 最佳答案
future.get(timeout, timeUnit)
将尝试在指定的时间内检索将来的结果。如果在超时结束前未完成将来操作,get
将引发异常。
但是基本任务不会停止。
因此,除非您取消任务,否则executeBatch
将在超时到期后继续正常运行。