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

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

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

【问题讨论】:

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

标签: java spring hibernate


【解决方案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()方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2015-07-14
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
相关资源
最近更新 更多