我知道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();
修改
答案 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();
}
}