java – Entitiy Manager在本机查询调用结束之前不回答
发布时间:2020-12-15 02:11:21 所属栏目:Java 来源:网络整理
导读:我在项目中使用了Hibernate和Oracle SQL.当我调用实体管理器的createNativeQuery方法时,实体管理器在方法返回之前不响应任何调用(甚至来自不同的浏览器).查询需要很长时间,但在新的线程中调用它.为什么实体经理被封锁了? 注意:当我调用JPQL查询时,问题就消
我在项目中使用了Hibernate和Oracle SQL.当我调用实体管理器的createNativeQuery方法时,实体管理器在方法返回之前不响应任何调用(甚至来自不同的浏览器).查询需要很长时间,但在新的线程中调用它.为什么实体经理被封锁了?
注意:当我调用JPQL查询时,问题就消失了. @PersistenceContext private EntityManager entityManager; //blocking other transactions,cannot make any read from the same entityManager until this method is completed. @Transactional(readOnly=true) public void testMethod1(String query) { Query q = entityManager.createNativeQuery(query); // CANNOT SET LOCKMODE because it is not JPQL : q.setLockMode(LockModeType.NONE) //throws exception List<Object[]> result = q.getResultList(); } @Transactional(readOnly=true) public void testMethod2(String jpql) { Query q = entityManager.createQuery(jpql); List<Object> result = q.getResultList(); } 解决方法
我能够使用其他数据库(在我的情况下为SQL Anywhere)重现您的问题.
在此之后我查看了Hibernate JavaDocs并且它说您的问题是默认行为,因为JPA要求setLockMode应仅应用于非本机查询. 为了解决这个问题,Hibernate使用了查询的QueryHints: NATIVE_LOCKMODE: 要使用QueryHints,您应该执行以下操作: @Transactional(readOnly=true) public void testMethod1(String query) { Query q = entityManager.createNativeQuery(query); q.setHint(QueryHints.NATIVE_LOCKMODE,LockModeType.NONE); List<Object[]> result = q.getResultList(); } 我还发现如果你在方法上面使用@TransactionAttribute,问题可能不会发生,例如: @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void testMethod1(String query) { Query q = entityManager.createNativeQuery(query); q.setHint(QueryHints.NATIVE_LOCKMODE,LockModeType.NONE); List<Object[]> result = q.getResultList(); } 请尝试上面给出的解决方案,如果问题解决了,请告诉我们,祝你好运! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 如何在JavaFX TitledPane中设置/删除insets
- java – Hibernate 4与ehcache需要ehcache-core库吗?
- 这个简单工厂是否违反了开放封闭原则?
- java – SoftReferences与Weakreferences / OutOfMemoryErr
- java初学使用eclipse运行程序
- java – 使用正则表达式重新格式化代码
- Java中String初始化了String域 和 构造器初始化的String域的
- 使用getResourceAsStream时,Findbugs“方法可能无法关闭流”
- 邮件收发原理你了解吗? 邮件发送基本过程与概念详解(一)
- 在Java中使用枚举单例有什么用?