大神们:调用java.sql.ResultSet.next() 时,线程hang住了(数据库是oracle)
问个问题:调用java.sql.ResultSet.next() 时,线程hang住了,即不超时,也不返回,更没有报错
数据库:oracle 11g
jdk:java7
业务:Result rs = PreparedStatement.executeQuery() ,然后while(rs.next())。
情况偶尔出现。
java.sql.ResultSet不能设置超时,而且PreparedStatement的超时设置不能传递到ResultSet。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
引用来自“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异常,通过捕获异常进行超时之后的处理。
求next怎么设置超时。整个ResultSet都没有设置超时的方法
我猜你的问题是希望获得一个解决办法来让线程继续运行下去,如果是这样超时控制是个不错的选择,鉴于你遇到的问题比较诡异,所以推荐你用线程异步执行java.sql.ResultSet.next()方法,这样可以手动设置超时时间。
首先构造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异常,通过捕获异常进行超时之后的处理。