我想在javax.persistence.TypedQuery上设置超时。
我发现了这个简单的方法:
TypedQuery<Foo> query = ... ;
query.setHint("javax.persistence.query.timeout", 1000);
query.getReturnList();
但似乎不起作用,它只是被忽略了。
来自 PRO JPA 2 一书:
&#34;不幸的是,设置查询超时不是可移植行为。它 所有数据库平台可能都不支持,也不是必需的 得到所有持久性提供者的支持。因此,应用程序 想要启用查询超时的必须为三个准备 场景。
第一个是静默忽略该属性并且没有效果。
第二个是该属性已启用,任何选择,更新或 删除运行时间超过指定超时值的操作 中止,并抛出QueryTimeoutException。这个例外可能是 处理并且不会导致任何活动的交易被标记 回滚。
第三种情况是该属性已启用,但这样做 超时时,数据库强制执行事务回滚 超标。在这种情况下,将抛出PersistenceException并且 标记为回滚的事务。一般来说,如果启用了 应该编写应用程序来处理QueryTimeoutException,但是 如果超过超时且异常不是,则不应该失败 。抛出&#34;
有没有人知道在TypedQuery上指定超时的任何其他方法?
或者我怎样才能做到这一点&#34;提示&#34;工作
由于
编辑:Oracle 11.2.0.4.0和PostgreSql 9.2.9 使用JPA 2.1 / Hibernate
答案 0 :(得分:5)
我知道它的回复迟了,但是我们遇到了类似的问题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();
希望它有所帮助!
答案 1 :(得分:0)
是的Hint被忽略了,它不起作用请回顾这个问题。你应该为javax.persistence.query.timeout
设置超时