Gae*_*ano 0 java jpa java-ee criteria-api jpa-2.1
我想在javax.persistence.TypedQuery上设置超时.
我发现这个简单的方法:
TypedQuery<Foo> query = ... ;
query.setHint("javax.persistence.query.timeout", 1000);
query.getReturnList();
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用,它只是被忽略了.
从PRO JPA 2书中:
"不幸的是,设置查询超时不是可移植行为.它可能不受所有数据库平台支持,也不是所有持久性提供程序都支持的要求.因此,必须为三种情况准备要启用查询超时的应用程序.
首先是该属性被默默地忽略并且没有效果.
第二个是启用该属性,并且中止任何超过指定超时值的选择,更新或删除操作,并抛出QueryTimeoutException.可以处理此异常,并且不会导致任何活动事务被标记为回滚.
第三种情况是该属性已启用,但在执行此操作时,数据库会在超出超时时强制执行事务回滚.在这种情况下,将抛出PersistenceException并将事务标记为回滚.通常,如果启用,则应编写应用程序以处理QueryTimeoutException,但如果超出超时并且不抛出异常,则不应该失败."
有没有人知道在TypedQuery上指定超时的任何其他方法?
或者我怎样才能使这个"提示"起作用?
谢谢
编辑:Oracle 11.2.0.4.0和PostgreSql 9.2.9与JPA 2.1/Hibernate
我知道它的回复很晚,但是我们遇到类似的问题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();
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
4233 次 |
| 最近记录: |