我正在尝试使用在相当远的数据库上运行的预准备语句,用于访问此数据库的网络连接存在相当大的滞后和不可靠性。 停机时间长达一分钟很常见。 问题是,如果出现这样的故障,如果我的程序试图执行任何准备好的语句,整个线程就会进入无限等待状态。它永远不会超时,只是等待数据库的响应。
我尝试使用方法 setQueryTimeout()在执行时显式设置超时,但是,这个方法似乎存在一些问题,如果网络出现故障,它无法正常工作。
有没有替代方法呢?
答案 0 :(得分:3)
据我所知,如果网络本身失败,就没有这样的选择。
setQueryTimeout的确切细节涉及指示JDBC驱动程序向数据库发送带外信号(至少在Oracle JDBC驱动程序的情况下)以停止执行Prepared Statement;这部分很重要,因为它取决于驱动程序和数据库中内置的支持。在此之后,数据库可以安排执行此“取消”操作;如果必须回滚事件或者必须执行其他事务等,这可能需要一段时间。
鉴于实现性质的第一部分,不太可能建立超时功能的“干净”实现。您可能想在此处调查事务管理器的使用(也许是JTA),但我不确定是否会遇到另一组奇怪的异常(想想启发式异常)。
<强>附录强>
使用监视其他线程执行并杀死“卡住”线程的线程监视器可能是一个坏主意。 This SO question将有助于回答为什么应该避免此类活动。这也是tactic chosen by WebLogic Server。