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

时间:2015-10-07 15:03:10

标签: java apache hibernate jpa hikaricp

我们的应用程序包含apache Web服务器作为入口点,应用程序将在另一台服务器上运行。所以在apache中我们将超时配置为40秒,但是在应用程序中,一些查询花费更多时间来获取超过40秒的记录,因为这样的原因是apache抛出5xx错误。但是,当我们从apache web服务器得到响应后,查询将从数据库中获取记录。

如何在40秒后终止该查询(或事务)(即apache超时)?

提前致谢。

5 个答案:

答案 0 :(得分:2)

您可以使用Spring AsyncTaskExecutor

  

异步TaskExecutor实现的扩展接口,   提供带有start的重载执行(Runnable,long)变体   超时参数以及对Callable的支持。注意:执行者   class包含一组可以转换其他常见的方法   类似闭包的对象,例如PrivilegedAction to Callable之前   执行它们。

答案 1 :(得分:1)

我们可以使用Hibernate事务管理器setDafaultTimeout方法指定超时到期。

      HibernateTransactionManager transactionManager = new HibernateTransactionManager();
      transactionManager.setDefaultTimeout(int timeoutinSecs);

然后hibernate会抛出事务超时过期的异常。根据我们的要求,我们可以处理这个例外。

答案 2 :(得分:0)

停止数据库查询的一种方法是Statement.cancel()

答案 3 :(得分:0)

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

如果你有一个长查询,JTA超时不是很有用,因为JTA不能中断JDBC调用。

修改

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

答案 4 :(得分:0)

您可以改进实现自己的查询处理程序并使用您想要的任何条件终止查询。

Automatically killing long running fetch(Select) queries (MySql)