是否可以为Oracle数据库查询指定连接/查询超时?在Oracle端还是在Oracle的JDBC驱动程序(10.2.0.4)中?那么,那个Java客户端刚刚收到错误,比方说,2分钟而不是等到Oracle完成执行查询?
答案 0 :(得分:6)
如果在事务上下文中执行查询,则JTA事务监视器的事务超时值将是查询超时的决定因素。此配置取决于从一个应用程序服务器到另一个应用程序服务器。
在单个查询级别(缺少JTA事务监视器)时,setQueryTimeout方法可用于设置Statement / PreparedStatement / CallableStatement对象执行的超时。
<强>更新强>
不应依赖setQueryTimeout,尽管它可以工作(至少来自J2SE客户端)。它通过JDBC驱动程序执行Oracle数据库服务器的完整往返。然后,数据库停止执行查询。不要依赖它来进行时间关键的应用。
答案 1 :(得分:3)
查看Oracle个人资料。这允许您在数据库级别指定多个限制。其中一个是每个查询的最大CPU时间。
如果您的查询定期运行超过2分钟,您可能需要先对查询进行一些调整。
答案 2 :(得分:0)
根据http://www.javamonamour.org/2012/09/oraclenetconnecttimeout.html
对于jdbc版本<10.1.0.5oracle.net.READ_TIMEOUT对于jdbc版本> = 10.1.0.5的oracle.jdbc.ReadTimeout
因此,如果您使用的是JDBC驱动程序版本10.1.0.5或更高版本,则oracle.jdbc.ReadTimeout是正确的属性。
答案 3 :(得分:0)
设置oracle.jdbc.ReadTimeout有助于使jdbc调用超时。我在生产Spring Boot应用程序中通过指定以下数据源属性来使用它
spring.datasource.hikari.connection-timeout=1000
spring.datasource.hikari.dataSourceProperties=oracle.jdbc.ReadTimeout=2000
注意:之前,此应用使用的是tomcat连接池,并且在将上述属性设置为相同值之后,发生了超时,但该池无法有效处理关闭的连接对象。因此,我切换到hikariCP并获得了更好的结果。我做了一个video,它模拟了慢速的jdbc调用,该调用在使用ReadTimeout属性时将结果与tomcat和hikari连接池进行了比较。