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

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

使用案例:

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

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

在某些情况下,我可能会运行多个语句。

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

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

这是查询的启动方式:

Query query = mEntityManager.createNativeQuery(globalQuery.toString()); List results = query.getResultList(); 

编辑:

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

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

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

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

 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(); } }