如何取消正在运行的SQL查询?
我知道statement.cancel()可以用来取消正在运行的SQL查询,但我想知道的是,我将如何在另一个线程中获取此语句对象。
使用案例:
- 我请求启动一个运行语句的线程。
- 然后从一个单独的请求(另一个线程)我可能想取消这个线程。
如何在这个新请求中获取语句来调用其中的cancel方法。
在某些情况下,我可能会运行多个语句。
附加信息,它是一个Web应用程序,使用spring框架,hibernate和JPA。 现在在UI中有2个按钮,按钮1将触发SQL查询,按钮2必须取消该查询
我提到了这个例子,但它使用相同的线程来调用新线程,这是我无法做到的。
这是查询的启动方式:
Query query = mEntityManager.createNativeQuery(globalQuery.toString()); List results = query.getResultList();
编辑:
- 我能想到的一种方法是跟踪所有正在运行的语句,然后找到必须取消SQL语句的语句。
有两种不同的会话可以帮助您:
如果要在同一用户的两个请求之间交换像语句这样的对象,如果这些请求并行或一个接一个地运行,则通常将它们存储在HttpServletRequest
的HttpSession
中。
您可以使用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(); } }
- Hibernate支持Postgresql UUID?
- hibernate删除错误:批量更新返回意外行计数
- 如何在使用Hibernate时将Serializable更改为String
- Hibernate / JPA中注释字段或getter方法之间的性能差异
- 线程“main”中的exceptionorg.hibernate.MappingException:未知实体
- 如何在hibernate中首次创建数据库模式,并在模式修改时进一步更新?
- 针对不同字段值长度的Hibernate Criteria
- Spring,Hibernate和JPA:在entitymanager上调用persist似乎没有提交数据库
- 如何在Hibernate Criteria中添加Distinct