【问题标题】:How to abort/cancel HSQLDB query如何中止/取消 HSQLDB 查询
【发布时间】:2016-03-09 17:23:05
【问题描述】:

我有一个使用 Hibernate 提供的 JPA 和一个 HSQL 数据库的 Java SE 应用程序。应用程序使用 EntityManager 查询数据库以获取信息,以便在屏幕上绘制图表。在执行查询时,图表区域有一个典型的旋转图标,让用户知道它正在工作。有些查询需要很长时间,我希望有中止/取消查询的功能。我知道我可以打开 EntityManager 并获取 Hibernate Session 并调用 cancelQuery(),但这并没有做任何事情,因为 HSQLDB 驱动程序不支持 Statement 接口 (http://hsqldb.org/doc/2.0/apidocs/org/hsqldb/jdbc/JDBCStatement.html#cancel()) 上的 cancel() 方法。是否有其他方法可以通过 API 或重新设计我的应用程序?无法取消正在运行的查询很麻烦。

【问题讨论】:

  • 可能简单地中断线程就可以了。虽然不知道它在 HSQLDB 中是如何处理的,但值得一试,因为它实现起来非常简单

标签: hibernate jpa hsqldb


【解决方案1】:

您可以使用具有管理员权限的单独连接并在不同的会话中终止事务:

ALTER SESSION <session number> RELEASE

http://hsqldb.org/doc/2.0/guide/sessions-chapt.html#snc_statements

在 HSQLDB 的最新 Subversion 版本中,此语句还终止在目标会话中运行的任何 SELECT 语句。

您可以使用 SESSION_ID() 找到会话的 id 并使用它来释放会话。

此外,可以在执行查询之前使用 JDBCStatement.setQueryTimeout(n)。

可能会在不久的将来支持cancel()方法。

【讨论】:

  • 这是 HSQLDB 特定的。有没有办法通过 JPA 或 JDBC 接口取消查询?如果我使用此查询,我将不得不在应用程序中进行。我怎么知道要发布哪个会话?有没有办法获取和存储会话 ID,以便我以后可以使用它来提交此查询以释放它?
  • 这是否意味着只能在服务器模式(hsql://)下使用HSQLDB,而不能在本地文件(file:)模式下使用?
  • 它可以在服务器模式和嵌入式模式下使用不同的会话完成。
【解决方案2】:

目前无法在 HSQLDB 服务器上结束长时间运行的语句。 Fredt 提供的 ALTER SESSION 方法似乎在当前的 RC2 for 2.3.4(以及 svn 修订版 5511)中不起作用,它只会在 select 语句完成工作后导致事务回滚:序列化失败。所以解决这个问题的唯一方法是设置超时。不过,这并不是问题的实际解决方案。

更新:在 SVN 存储库 (Rev. 5627) 中的最新版本 HSQLDB 和即将发布的 2.3.4 版本中,现在实现了立即取消语句的可能性。还有一个新方法,ALTER Session END STATEMENT,它可以在不回滚的情况下中止事务。详情请见https://sourceforge.net/p/hsqldb/bugs/1436/

【讨论】:

  • 我的想法完全正确。我也使用 ALTER SESSION 方法看到了这些错误。即使没有抛出错误,我怎么知道要释放哪个会话 ID?我同意超时不是解决方案。有些查询自然需要很长时间,如果用户不想再等待,应该有办法取消查询。
  • 我忘记了这一切。是的,较新版本的 HSQLDB 现在支持通过 JDBC API 取消查询。对于旧版本,我只是将正在运行的查询扔到后台,忽略它,然后继续。
猜你喜欢
  • 2015-10-06
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多