我有一个Spring,Hibernate和Wicket应用程序设置为从数据库中读取国际化的json内容项并通过api url上的请求传递出去。负责传递数据的代码库是为企业客户开发的整体网站结构的一小部分。Hibernate OpenSessionInViewFilter过早关闭会话?
在超过90%的情况下,api的功能很好,但客户正在经历一个有趣的偶发性问题,这可能是由于孤立的hibernate会话导致的。该请求将通过PHP脚本失败,并给出错误:
Warning: file_get_contents(http://client.net/api/attachment_lines?ce=false&language=en®ion=na&ts=1341592326) [function.file-get-contents]: failed to open stream: Redirection limit reached, aborting in client_api->send_request() (line 38 of <sitepath>/api.class.php).
而且将产生下面的错误在Tomcat服务器日志:
09:15:00,200 ERROR [RequestCycle] failed to lazily initialize a collection of role: com.client.data.AttachmentLineCode.attachmentSublineCodes, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.client.data.AttachmentLineCode.attachmentSublineCodes, no session or session was closed
应用程序被弹簧内配置为使用的OpenSessionInViewFilter和@Transactional注释设计模式,所以我不确定是什么导致间歇性请求失败。除此之外,客户指出,在问题发生后约15分钟,api将继续失败,这在配置上看起来确实很古怪。在web.xml中,这里是过滤器的声明:
<filter>
<filter-name>openEntityManagerInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openEntityManagerInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
内的代码,这里是通用的DAO事务注释这是由内容项DAO扩展:
@Transactional(noRollbackFor={javax.persistence.EntityNotFoundException.class, org.springframework.orm.ObjectRetrievalFailureException.class})
public class GenericDaoHibernate<T, PK extends Serializable> implements GenericDao<T, PK> {
@Autowired
private SessionFactory sessionFactory;
内泛型DAO为好,这里是我检索和使用会话:
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
protected Criteria createCacheableCriteria(Class<T> clazz) {
Criteria criteria = createNonCacheableCriteria(clazz);
criteria.setCacheable(true);
criteria.setCacheMode(CacheMode.NORMAL);
return criteria;
}
protected Criteria createCacheableCriteria(Class<?> clazz, String alias) {
Criteria criteria = createNonCacheableCriteria(clazz, alias);
criteria.setCacheable(true);
criteria.setCacheMode(CacheMode.NORMAL);
return criteria;
}
protected Criteria createNonCacheableCriteria(Class<?> clazz) {
Session session = getSession();
Criteria criteria = session.createCriteria(clazz);
criteria.setCacheable(false);
criteria.setCacheMode(CacheMode.IGNORE);
return criteria;
}
protected Criteria createNonCacheableCriteria(Class<?> clazz, String alias) {
Session session = getSession();
Criteria criteria = session.createCriteria(clazz, alias);
criteria.setCacheable(false);
criteria.setCacheMode(CacheMode.IGNORE);
return criteria;
}
是否有某种方式,本次会议可以在这个设置得到孤儿?是否有某种内置的超时时间来休眠会导致此问题的会话?缓存可能存在问题?在此先感谢您的帮助。
你是如何使用'SessionFactory'?通过'HibernateTemplate'?你能给我们一个草案的代码吗? – 2012-07-27 20:04:21
添加了与我使用SessionFactory相关的其他代码。谢谢回复! – Wertible 2012-07-30 16:07:25