【发布时间】: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