如何取消 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 持久性查询是不是容易受到 sql 注入的影响?