2009-09-07 93 views
2

是否可以指定Oracle数据库查询的连接/查询超时?在Oracle端还是在Oracle的JDBC驱动程序(10.2.0.4)中?那么,那个Java客户端刚刚收到了一个错误,比如说,等2分钟,而不是等到Oracle完成执行查询之后呢?Oracle连接/查询超时

回答

4

如果您在事务上下文中执行查询,则JTA事务监视器的事务超时值将成为查询超时的决定因素。这个配置依赖于一个应用服务器到另一个应用服务器。

在单个查询级别(在没有JTA事务监视器的情况下),setQueryTimeout方法可用于设置执行Statement/PreparedStatement/CallableStatement对象的超时时间。

更新

setQueryTimeout是不被依赖,但它的工作原理(ATLEAST从J2SE客户端)。它通过JDBC驱动程序执行完整的Oracle数据库服务器往返。然后,由数据库决定停止执行查询。不要依赖于时间关键型应用程序。

+1

我们遇到了JTA超时的问题,因为它不影响正在运行的查询。而我们在尝试运行实际的WebLogic服务器杀长时间运行的连接,并创建另一个线程来杀死它,但它击中的Java锁在Oracle JDBC驱动程序从而导致两个线程等待。随着WebLogic试图创建更多的杀手级线程并最终运行,问题变得更加严重。 – 2009-09-07 12:10:50

+0

约setQueryTimeout点似乎很intresting,我以前没有actuallly想到这一点:)。我们并不关心setQueryTimeout是否需要一些时间来取消查询,这里主要的是结果:)。我将回到测试结果。 – 2009-09-07 12:13:57

+1

原因setQueryTimeout()可能无法在WLS工作,是因为JTA的更是这样。我不认为驱动程序会在事务上下文中响应setQueryTimeout调用,但我可能不正确。 – 2009-09-07 15:02:01

2

查看Oracle配置文件。这使您可以在数据库级别指定多个限制。其中之一是每个查询的最大CPU时间。

如果您的查询定期运行超过2分钟,则可能需要先对查询进行一些调整。

+0

Oracle配置文件会影响用户的所有查询。 OP可能只对一个需要取消的特定查询感兴趣。 – 2009-09-07 14:56:15

+1

但是,这将作为一个蛮力解决方案;-) – 2009-09-07 15:02:45

+0

如果setQueryTimeout不起作用,Oracle配置文件将成为我们的下一步。 – 2009-09-08 10:40:02