我有一个
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调用?