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

Java 在超时后终止长时间运行的查询,java,apache,hibernate,jpa,hikaricp,Java,Apache,Hibernate,Jpa,Hikaricp,我们有一个包含ApacheWeb服务器作为入口点的应用程序,该应用程序将在另一台服务器上运行。因此,在apache中,我们将超时配置为40秒,但在应用程序中,一些查询需要更多的时间来获取超过40秒的记录,这就是apache抛出5xx错误的原因。但是在我们从ApacheWeb服务器得到响应之后,查询正在从数据库中获取记录 如何在40秒(即apache超时)后终止该查询(或事务) 提前感谢。您可以使用Spring的 用于异步TaskExecutor实现的扩展接口, 提供了一个重载的带有start的e

我们有一个包含ApacheWeb服务器作为入口点的应用程序,该应用程序将在另一台服务器上运行。因此,在apache中,我们将超时配置为40秒,但在应用程序中,一些查询需要更多的时间来获取超过40秒的记录,这就是apache抛出5xx错误的原因。但是在我们从ApacheWeb服务器得到响应之后,查询正在从数据库中获取记录

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

提前感谢。

您可以使用Spring的

用于异步TaskExecutor实现的扩展接口, 提供了一个重载的带有start的execute(Runnable,long)变量 超时参数以及对可调用的支持。注:遗嘱执行人 类包括一组方法,这些方法可以转换其他一些常用的 例如,类似于闭包的对象在调用之前具有可调用的特权 执行它们


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

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

若您有一个长查询,JTA超时并不是很有用,因为JTA不能中断JDBC调用

编辑


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

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

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

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

您可以很好地实现自己的查询处理程序,并根据需要的任何条件终止查询


您是否查看了可以通过连接池/
数据源
/query string或JDBC级别配置的各种超时?请您就这些配置向我提供指导。通常,如果您搜索JDBC驱动程序或连接池的名称以及“超时”一词,您将找到说明如何设置这些参数的文档。例如,许多JDBC驱动程序都有额外的超时连接字符串参数。我有近5-10个查询我们是否需要使用此方法为每个查询设置超时,或者是添加所有这些查询的任何通用方法通常可以在数据源级别进行配置,例如,has queryTimeout attributeIt不会停止数据库中的长查询。您可能还必须为数据库操作定义超时。这通常在数据库中完成。