如何取消 Java 持久性中正在运行的查询?

Posted

技术标签:

【中文标题】如何取消 Java 持久性中正在运行的查询?【英文标题】:How to cancel a running query in java persistence? 【发布时间】:2015-06-17 05:53:04 【问题描述】:

我的应用程序使用 Persistence API、Hibernate 和 Spring 运行。我正在使用 mysql 数据库。 有些查询可能需要很长时间来计算,所以我需要一个取消按钮来取消这些查询的执行。

我发现有一个方法 java.sql.statement.cancel() 用于取消查询,但这可以从语句对象访问,如何从 Java 持久性中的 entityManager 对象执行此操作?

【问题讨论】:

我不知道如何取消查询,但您可能更喜欢使用 javax.persistence.query.timeout jpa 属性以毫秒为单位设置超时。 【参考方案1】:

您可以使用休眠会话对象CancelQuery()方法。

此外,如果您想自动执行此操作,您可以设置查询超时。 JPA 2 定义 javax.persistence.query.timeout 提示以指定默认超时(以毫秒为单位)。 (从 Hibernate 3.5 开始可用)

JPA 提供 javax.persistence.query.timeout 提示以指定查询超时(以毫秒为单位)。可以在@NamedQuery 或@NamedNativeQuery 中指定此提示。它也可以通过调用 setHint 方法在 Query 或 TypedQuery 上指定。提示定义的查询超时可以被 setHint 方法覆盖。

可以在persistence.xml中为应用指定默认查询超时时间,如下所示:

<persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        ...
       <property name="javax.persistence.query.timeout" 
        value="30" />
     </properties>
 </persistence-unit>

【讨论】:

好的,有没有也可以从 entityManager 调用的方法? 很难从 EntityManager 显式取消它,您需要设置超时。如果查询未在指定时间内执行,这将负责取消查询。 那么除了 timeout 之外,Entitymanger 没有办法做到这一点? 我在我的类中获取了 EntityManager 对象,我是否也可以在同一个类中使用 HibernateSession 对象? 可以从会话工厂获取当前会话并调用cancelquery()方法。

以上是关于如何取消 Java 持久性中正在运行的查询?的主要内容,如果未能解决你的问题,请参考以下文章

关闭持久性管理器后如何使查询结果可用

使用 Java 持久性查询语言按顺序查找间隙

参数化的 java 持久性查询是不是容易受到 sql 注入的影响?

如何在同一个 Hibernate 事务中运行原生 SQL 查询?

Java中的持久性[关闭]

JavaEE Tutorials (10) - Java持久化查询语言