当前位置: 首页 > 面试题库 >

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

宋丰
2023-03-14
问题内容

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

用例:

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

我将如何在这个 新请求中 获得声明以在其中调用cancel方法。

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

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

我提到了这个示例,但是它使用相同的线程来调用新线程,而我不能这样做。

这是启动查询的方式:

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

编辑:

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

问题答案:

有两个不同的会话可以为您提供帮助:

如果您想在同一个用户的两个请求之间交换一个类似于您的语句的对象,而这些请求是并行运行还是一个接一个地运行,则通常将它们存储在HttpSessionHttpServletRequest

您可以使用SessionHibernate取消当前查询:

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

}


 类似资料:
  • 问题内容: 有没有一种方法可以显示执行查询时Django正在运行的SQL? 问题答案: 请参阅文档FAQ:“如何查看Django正在运行的原始SQL查询? ” 包含SQL查询的列表: 查询集还具有包含要执行的查询的属性: 请注意,查询的输出不是有效的SQL,因为: “ Django实际上从未插值参数:它将查询和参数分别发送到数据库适配器,后者执行适当的操作。” 来自Django错误报告#17741

  • 问题内容: 我从Linux Shell 连接到。我时不时地运行一个太大的查询。它可以打印,我已经知道这不是我的意思。我想停止查询。 击中(几次)会完全杀死并把我带回外壳,因此我必须重新连接。 是否可以在不杀死自己的情况下停止查询? 问题答案:

  • 问题内容: 如何以编程方式停止正在运行的mysql查询? 我面临的问题是查询是使用用户提供的数据构造的,并且偶尔可能需要很长时间才能执行(大型表15-3000万行)。我想为用户提供一个cancel- option,但不知道如何停止当前正在执行的mysql-query。 该应用程序是Java applet- servlet:用户在applet中指定条件,该条件将传递给servlet,在servlet

  • 我试图从另一个表中创建一个子表,其中所有的姓氏字段排序为A-Z,其中有一个电话号码字段不是null。我可以用SQL很容易做到这一点,但是我不知道如何在Excel中运行SQL查询。我很想将数据导入postgresql,然后在那里查询,但这似乎有点过分。 对于我正在尝试做的事情,SQL查询可以做到这一点。这似乎太简单了,因为它是Excel本地无法完成的事情。如何在Excel中运行这样的SQL查询?

  • 问题内容: 如何获得一列,该列是另一列之前的所有值的总和? 问题答案: 您可以通过将表与其自身联接(执行所谓的笛卡尔或交叉联接)来实现。请参见以下示例。 给定一个包含国家及其人均GDP的表格,它将为您提供GDP总量的连续数字。 请注意,这可能是非常耗费资源的操作,因为如果一个表包含N个元素,它将创建一个包含N * N个元素的临时表。我不会在大桌子上执行它。

  • 问题内容: 当photoId直接在语句上而不是变量时,以下代码完全没有问题。 但是以下内容将无法正常运行,这可能是导致未选择该内容的原因。 这是在while循环内。 谢谢。 问题答案: 在php a和a中有很大的不同,查询语法在查询周围是双引号,在变量周围是单引号。。尽管我建议您在查询中使用参数,而不是直接将变量直接放入查询中 根据我的建议,您应该将查询更改为此: 这只是它的基本要点…如果您想了解