大神们:调用java.sql.ResultSet.next() 时,线程hang住了(数据库是oracle)

发布于 2021-11-27 10:50:34 字数 784 浏览 813 评论 4

问个问题:调用java.sql.ResultSet.next() 时,线程hang住了,即不超时,也不返回,更没有报错

数据库:oracle 11g

jdk:java7

业务:Result rs = PreparedStatement.executeQuery()  ,然后while(rs.next())。

情况偶尔出现。

java.sql.ResultSet不能设置超时,而且PreparedStatement的超时设置不能传递到ResultSet。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

等风来 2021-12-01 07:41:30

引用来自“zfc827”的评论

首先构造Executor接口,下面的例子是创建一个单线程的执行者,你也可以根据需要创建基于线程池的执行者

ExecutorService executor = Executors.newSingleThreadExecutor();

将rs.next()方法委托给Callable接口去调用,通过Future接口获取返回结果

FutureTask<Boolean> future =
                        new FutureTask<Boolean>(new Callable<Boolean>() {
                            public Boolean call() throws IOException {
                                return rs.next();
                            }
                        });

将Callable接口委托给执行者执行

executor.execute(future);

通过 future 的get方法获取callable的返回结果,并设置超时时间

boolean hasNext = future.get(timeOut, TimeUnit.SECONDS);

其中TimeUnit可以指定超时单位,timeOut指定数值,比如设置10秒,若超时结果还有返回,调用get方法会抛出TimeOut异常,通过捕获异常进行超时之后的处理。

后知后觉 2021-12-01 06:06:32

求next怎么设置超时。整个ResultSet都没有设置超时的方法

坏尐絯 2021-12-01 04:38:47

我猜你的问题是希望获得一个解决办法来让线程继续运行下去,如果是这样超时控制是个不错的选择,鉴于你遇到的问题比较诡异,所以推荐你用线程异步执行java.sql.ResultSet.next()方法,这样可以手动设置超时时间。

温柔少女心 2021-11-29 20:16:22

首先构造Executor接口,下面的例子是创建一个单线程的执行者,你也可以根据需要创建基于线程池的执行者

ExecutorService executor = Executors.newSingleThreadExecutor();

将rs.next()方法委托给Callable接口去调用,通过Future接口获取返回结果

FutureTask<Boolean> future =
                        new FutureTask<Boolean>(new Callable<Boolean>() {
                            public Boolean call() throws IOException {
                                return rs.next();
                            }
                        });

将Callable接口委托给执行者执行

executor.execute(future);

通过 future 的get方法获取callable的返回结果,并设置超时时间

boolean hasNext = future.get(timeOut, TimeUnit.SECONDS);

其中TimeUnit可以指定超时单位,timeOut指定数值,比如设置10秒,若超时结果还有返回,调用get方法会抛出TimeOut异常,通过捕获异常进行超时之后的处理。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文