如何取消正在运行的SQL查询?

时间:2015-11-26 06:23:23

标签: java sql hibernate jpa

我知道statement.cancel()可用于取消正在运行的SQL查询,但我想知道的是,如何在另一个线程中获取此语句对象。

用例:

  • 我请求启动一个运行语句的线程。
  • 然后从另一个请求(另一个线程)我可能想要取消这个帖子。

如何在新请求中获取语句来调用其中的cancel方法。

可能会出现多个语句在运行的情况。

附加信息,它是一个Web应用程序,使用spring框架,hibernate和JPA。现在在UI中有2个按钮,按钮1将触发SQL查询,按钮2必须取消该查询

我提到了this示例,但它使用相同的线程来调用新线程,这是我无法做到的。

这是查询的启动方式:

    Query query = mEntityManager.createNativeQuery(globalQuery.toString());
    List<Object[]> results = query.getResultList();

修改

  1. 我能想到的一种方法是跟踪所有正在运行的语句,然后找到必须取消SQL语句的语句。

1 个答案:

答案 0 :(得分:3)

有两种不同的会话可以帮助您:

如果要在同一用户的两个请求之间交换类似语句的对象,如果这些请求并行或一个接一个地运行,则通常将它们存储在HttpSession HttpServletRequest中}。

您可以使用Hibernate的Session取消当前查询:

public void startLongRunningStatement() {
  EntityManager entityManager = ...

  // Aquire session
  Session hibernateSession = ((HibernateEntityManager) em.getDelegate()).getSession();

  // Store the HibernateSession in the HttpSession
  HttpSession httpSession = servletRequest.getSession()
  httpSession.setAttribute("hibernateSession", hibernateSession);

  try {
    // Run your query  
    Query query = mEntityManager.createNativeQuery(globalQuery.toString());
    List<?> results = query.getResultList();

  } finally {
    // Clear the session object, if it is still ours
    if (httpSession.getAttribute("hibernateSession") == hibernateSession) {
      httpSession.removeAttribute("hibernateSession");
    }
  }
}

public void cancel() {
  // Get the Hibernate session from the HTTP session
  HttpSession httpSession = servletRequest.getSession()
  Session hibernateSession = (Session) httpSession.getAttribute("hibernateSession");
  if (hibernateSession != null) {
    // Cancel the previous query
    hibernateSession.cancelQuery();
  }

}