我有一个使用Hibernate提供的JPA和HSQL数据库的Java SE应用程序。应用程序使用EntityManagers查询数据库以获取信息,以便在屏幕上绘制图表。在执行查询时,图表区域具有典型的旋转图标,让用户知道它正在工作。有些查询需要很长时间,我想要使用该功能来中止/取消查询。我知道我可以解包EntityManager并获取Hibernate Session并调用cancelQuery(),但这并没有做任何事情,因为HSQLDB驱动程序不支持Statement接口上的cancel()方法({{3 }})。有没有其他方式通过API或重新设计我的应用程序?无法取消正在运行的查询是一件麻烦事。
答案 0 :(得分:2)
您可以使用具有管理员权限的单独连接,并在其他会话中终止交易:
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()方法。
答案 1 :(得分:1)
在Moment上,无法在HSQLDB服务器上结束长时间运行的语句。 Fredt提供的ALTER SESSION方法似乎不适用于2.3.4的当前RC2(以及svn修订版5511),它只会导致事务回滚:select语句完成后序列化失败。因此,解决此问题的唯一方法是设置超时。但这不是问题的实际解决方案。
更新:在SVN存储库(Rev。5627)和即将发布的2.3.4版本中最新版本的HSQLDB中,现在可以立即取消语句。还有一个新的方法,即ALTER SESSSION END STATEMENT,它可以在没有回滚的情况下中止事务。有关详细信息,请参阅https://sourceforge.net/p/hsqldb/bugs/1436/。