加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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:
可以将锁定模式应用于本机SQL查询,因为JPA要求Query.setLockMode(javax.persistence.LockModeType)在调用本机查询时抛出IllegalStateException.

要使用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();
}

请尝试上面给出的解决方案,如果问题解决了,请告诉我们,祝你好运!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读