gpt4 book ai didi

java - 超时时可运行任务内的 JDBC executeBatch 行为

转载 作者:行者123 更新时间:2023-11-30 10:08:28 26 4
gpt4 key购买 nike

我有一个 Runnable 任务,它使用 JDBC 执行批量更新。在主线程中,我创建了一个可运行任务的实例并将其提交给 ExecutorService,它为我提供了一个 Future 对象。然后,我通过 get 调用阻止了 future 的对象,并指定了 30 秒的超时。

可运行任务的run()方法结构如下:

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

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

现在的问题是,如果线程超时而执行仍在 ps.executeBatch() 并且没有更新 updateResult 数组,那么数据库更改是回滚还是保留? (我将自动提交设置为 true)如果数据库更改持续存在,我仍会将 updateResult 数组获取为 null,这通常意味着没有任何数据被保留。因此,我的程序会将其视为失败,而实际上并非如此。

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

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

可运行任务中的 ps.executeBatch() 是否可能在主线程调用 future.cancel(true) 之前持久化数据库更改,当get调用超时中断?

最佳答案

future.get(timeout, timeUnit) 将尝试在指定的时间内检索 future 的结果。如果 future 未在超时结束时完成,get 将抛出异常。

但底层任务不会停止。

因此除非您取消任务,否则 executeBatch 将在超时到期后继续正常运行。

关于java - 超时时可运行任务内的 JDBC executeBatch 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53742597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com