是否可以为Oracle数据库查询指定连接/查询超时?在Oracle方面还是在Oracle的JDBC驱动程序(10.2.0.4)中?那么,该Java客户端仅在2分钟之后又返回了一个错误,而不是等到Oracle完成执行查询后再返回一个错误?
如果要在事务上下文中执行查询,则JTA事务监视器的事务超时值将成为查询超时的决定因素。为此的配置取决于一台应用程序服务器到另一台应用程序服务器。
在单个查询级别(没有JTA事务监视器),可以使用setQueryTimeout方法设置执行Statement / PreparedStatement / CallableStatement对象时的超时。
更新资料
尽管可以使用setQueryTimeout(尽管它是有效的)(至少与J2SE客户端无关)。它通过JDBC驱动程序工作,执行到Oracle数据库服务器的完整往返。然后,由数据库决定是否停止执行查询。对于时间紧迫的应用程序不要依赖它。
我们遇到了JTA超时问题,因为它不会影响正在运行的查询。实际上,我们运行的WebLogic服务器试图终止长时间运行的连接并创建另一个线程终止该连接,但是它在Oracle JDBC驱动程序中击中了Java锁,因此导致两个线程都等待。当WebLogic试图创建更多的杀手线程,最终耗尽它们时,问题变得更加严重。
关于setQueryTimeout的观点似乎很吸引人,实际上我还没有想到过:)。我们并不在乎setQueryTimeout是否需要一些时间来取消查询,主要是结果:)。我将返回测试结果。
setQueryTimeout()可能无法在WLS中工作的原因,更是因为JTA。我不认为驱动程序会在事务上下文中响应setQueryTimeout调用,但是我可能不正确。
如果您的事务超时值太高,则可以验证在JTA服务中为WLS设置的超时,以及ejb-jar-xml(对于CMT)和在UserTransaction.setTransactionTimeout()中的BMT的trans-timeout-seconds属性中设置的超时。
看来setQueryTimout实际上在JTA上下文中有效,但并非总是如此。有时5分钟(我在方法中设置的值)后,查询超时,有时20分钟后,有时60分钟后。