例如如下的代码:
HibernateCallback callBack = new HibernateCallback<List<? extends BaseEntity>>() {
public List<? extends BaseEntity> doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery(finalQueryStr);
List<BaseEntity> list = query.list();
if (onAfterLoad && entityListenerController != null)
entityListenerController.afterLoad(className, list);
return list;
}
};
entityListenerController.afterLoad(className, list);
中使用又调用了另外的manager去执行查询,如此就形成了
ConnectionA open
ConnectionB open
ConnectionB close
ConnectionA close
的情形,这种使用方法在高并发下将导致因获取Connection而引发的死锁。
一种解决方法是加上只读事务@Transactional(readOnly = true)
以保证使用同一个Connection。