在超时后终止长时间运行的查询。

4
我们有一个应用程序,其中包含Apache Web服务器作为入口点,并且该应用程序将在另一台服务器上运行。因此,在Apache中,我们将超时配置为40秒,但是在应用程序中,某些查询需要更长的时间来获取记录,超过了40秒,由于这个原因,Apache会抛出5xx错误。但是在得到Apache Web服务器的响应后,查询仍然可以从数据库中获取记录。
如何在40秒(即Apache超时)后终止该查询(或事务)?
提前感谢您的帮助。

2
你是否查看了通过连接池/DataSource/查询字符串或JDBC级别可以配置的各种超时时间? - billc.cn
请问您能否指导我进行这些配置? - SMKReddy
通常,如果您在谷歌上搜索JDBC驱动程序或连接池的名称以及“timeout”一词,您会找到说明如何设置这些内容的文档。例如,许多JDBC驱动程序都具有用于超时的附加连接字符串参数。 - billc.cn
5个回答

2
你可以使用Spring的AsyncTaskExecutor
扩展了异步TaskExecutor实现的接口,提供了一个带有启动超时参数的execute(Runnable, long)重载版本以及对Callable的支持。注意:Executors类包括一组方法,可以在执行它们之前将一些其他常见的类似闭包的对象(例如PrivilegedAction)转换为Callable。

2
它无法停止数据库中的长查询。 - sibnick
您可能还需要为您的数据库操作定义超时时间。这通常在数据库中完成。 - Andres

1
我们可以使用 Hibernate 事务管理器的 setDefaultTimeout 方法来指定过期超时时间。
      HibernateTransactionManager transactionManager = new HibernateTransactionManager();
      transactionManager.setDefaultTimeout(int timeoutinSecs);

然后,Hibernate 将抛出事务超时过期异常。根据我们的要求,我们可以处理该异常。


0

0

这取决于您的环境。您可以在JTA中设置事务超时,也可以使用特定于数据库的功能,例如postgres会话参数:statement_timeout

如果您有一个长时间的查询,JTA超时并不是很有用,因为JTA无法中断JDBC调用。

编辑

JDBC API现在具有语句超时功能: java.sql.Statement.setQueryTimeout(int timeout),但并非所有驱动程序都支持它。


setQueryTimeOut(int time) 这个方法需要应用到每个查询中。我有将近5-10个查询,我们需要使用这种方法为每个查询设置超时时间,还是有通用的方法可以添加所有这些查询的超时时间? - SMKReddy
通常可以在数据源级别进行配置,例如 https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html 具有 queryTimeout 属性。 - sibnick

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接