gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:07:03 24 4
gpt4 key购买 nike

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

用例:

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

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

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

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

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

查询是这样开始的:

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

编辑:

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

最佳答案

有两种不同的类(class)可以帮助您:

如果你想在来自同一用户的两个请求之间交换像你的声明这样的对象,独立于这些请求是并行运行还是一个接一个地运行,你通常将它们存储在 HttpSessionHttpServletRequest

并且可以使用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();
}

}

关于java - 如何取消正在运行的 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33931835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com