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

无极限 发布于 2015/06/18 15:52
阅读 1K+
收藏 0

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

数据库:oracle 11g

jdk:java7

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

情况偶尔出现。

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

加载中
0
zfc827
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异常,通过捕获异常进行超时之后的处理。


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

引用来自“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异常,通过捕获异常进行超时之后的处理。


好认真。谢谢
返回顶部
顶部