问个问题:调用java.sql.ResultSet.next() 时,线程hang住了,即不超时,也不返回,更没有报错
数据库:oracle 11g
jdk:java7
业务:Result rs = PreparedStatement.executeQuery() ,然后while(rs.next())。
情况偶尔出现。
java.sql.ResultSet不能设置超时,而且PreparedStatement的超时设置不能传递到ResultSet。
首先构造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异常,通过捕获异常进行超时之后的处理。
首先构造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异常,通过捕获异常进行超时之后的处理。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。