开发者社区> 问答> 正文

大神们:调用java.sql.ResultSet.next() 时,线程hang?报错

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

数据库:oracle 11g

jdk:java7

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

情况偶尔出现。

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

展开
收起
爱吃鱼的程序员 2020-06-14 15:22:22 970 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

    ExecutorServiceexecutor= Executors.newSingleThreadExecutor();

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

    FutureTask<Boolean>future=
                newFutureTask<Boolean>(newCallable<Boolean>(){
                  publicBooleancall()throwsIOException{
                    returnrs.next();
                  }
                });

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

    executor.execute(future);

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

    booleanhasNext=future.get(timeOut,TimeUnit.SECONDS);

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


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

    引用来自“zfc827”的评论

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

    ExecutorServiceexecutor= Executors.newSingleThreadExecutor();

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

    FutureTask<Boolean>future=
                newFutureTask<Boolean>(newCallable<Boolean>(){
                  publicBooleancall()throwsIOException{
                    returnrs.next();
                  }
                });

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

    executor.execute(future);

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

    booleanhasNext=future.get(timeOut,TimeUnit.SECONDS);

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


    2020-06-14 15:22:37
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载