【问题标题】:Set timeout on a TypedQuery with JPA2使用 JPA2 在 TypedQuery 上设置超时
【发布时间】:2015-02-17 11:33:09
【问题描述】:

我想在 javax.persistence.TypedQuery 上设置超时。

我找到了这个简单的方法:

TypedQuery<Foo> query = ... ;
query.setHint("javax.persistence.query.timeout", 1000);
query.getReturnList();

但是好像不行,直接忽略了。

来自PRO JPA 2一书:

“不幸的是,设置查询超时不是可移植的行为。它 可能并非所有数据库平台都支持,也不是必需的 得到所有持久性提供者的支持。因此,应用 想要启用查询超时必须准备三个 场景。

首先是该属性被静默忽略,没有任何作用。

第二个是该属性已启用,并且任何选择、更新或 运行时间超过指定超时值的删除操作是 中止,并抛出 QueryTimeoutException。这个例外可能是 处理并且不会导致任何活动事务被标记为 回滚。

第三种情况是该属性已启用,但这样做 数据库在超时时强制回滚事务 超过。在这种情况下,将抛出 PersistenceException 并且 事务标记为回滚。一般来说,如果启用 应该编写应用程序来处理 QueryTimeoutException,但是 如果超过超时并且异常不是,则不应失败 扔了。”

有谁知道在 TypedQuery 上指定超时的任何其他方法?

或者我怎样才能使这个“提示”起作用?

谢谢

编辑:Oracle 11.2.0.4.0 和 PostgreSql 9.2.9 使用 JPA 2.1/休眠

【问题讨论】:

  • 对 Postgresql 的简单搜索表明他们可能没有在其 JDBC 驱动程序中实现 JDBC setTimeout,如果您可以掌握 Hibernate 使用的 JDBC 连接,请参阅stackoverflow.com/questions/1175173/… 并提供解决方法
  • 在此报告之后 (hibernate.atlassian.net/browse/HHH-4662) Hibernate 应该从 3.5 版开始支持它。 persistence.xml 中是否有全局设置。
  • 如果您指定的值小于半秒,则超时可能会被忽略。尽管 JPA 要求以毫秒为单位超时,但对于 java.sql.Statement#setQueryTimeout(int seconds),它舍入到秒

标签: java jakarta-ee jpa criteria-api jpa-2.1


【解决方案1】:

我知道回复晚了,但我们遇到了类似的问题 Oracle 11g, JPA2.0 并且这个提示不起作用。

实际上问题在于我们将它用作@NamedQuery 提示,并在@transactional 方面调用该函数。由于@NamedQuery 在上下文加载时被加载和编译,这个超时被事务超时覆盖。 您可以在http://javadeveloperz0ne.blogspot.in/2015/07/why-jpa-hints-on-namedquery-wont-work.html 找到更多信息。

解决方案是再次获取命名查询,然后应用超时。

Query query = entityManager.createNamedQuery("NamedQueryName");
query.setHint("org.hibernate.timeout", "5");
query.getSingleResult();

希望对你有帮助!

【讨论】:

    【解决方案2】:

    是的,提示被忽略,它不起作用,请查看这个问题。你应该为 javax.persistence.query.timeout 设置超时

    Set timeout on EntityManager query

    【讨论】:

    • 点击“在 EntityManager 查询上设置超时”
    • 在你的 persistence.xml
    • 我想明确地使用 te HINT,因为超时应该是动态配置的。
    猜你喜欢
    • 2010-09-28
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2010-12-05
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多