对准备好的陈述施加超时

ang*_*iac 5 java jdbc

我正在尝试使用在相当远的数据库上运行的预准备语句,用于访问此数据库的网络连接存在相当大的滞后和不可靠性.停机时间长达一分钟很常见.问题是,如果出现这样的故障,如果我的程序试图执行任何准备好的语句,整个线程就会进入无限等待状态.它永远不会超时,只是一直停滞不前,等待数据库的响应.

我尝试使用方法setQueryTimeout()在执行时显式地设置超时,但是,这个方法似乎存在一些问题,如果网络出现故障,它无法正常工作.

这有什么替代方法吗?

Vin*_*lds 3

据我所知,如果网络本身出现故障,就没有这样的替代方案。

setQueryTimeout 的具体细节涉及指示 JDBC 驱动程序向数据库发送 Out Of Band 信号(至少在 Oracle JDBC 驱动程序的情况下),以停止执行准备好的语句;这部分很重要,因为它取决于驱动程序和数据库内置的支持。接下来,由数据库来安排此“取消”操作的执行;如果必须回滚或必须执行其他事务等,这可能需要一段时间。

鉴于实现性质的第一部分,不太可能建立超时功能的“干净”实现。您可能想在这里调查事务管理器的使用(也许是 JTA),但我不确定是否会遇到另一组奇怪的异常(想想启发式异常)。

附录

使用线程监视器来监视其他线程的执行并杀死“卡住”的线程可能是一个坏主意。这个问题将有助于回答为什么应该避免这样的活动。这也是WebLogic Server选择的策略