一尘不染

使用Struts2休眠-使用完整的休眠插件或其他方法关闭会话?

hibernate

我正在使用Struts 2.2.1.1和Hibernate 3.6.2.Final。我还将C3P0用于在Tomcat 7.0.11上运行的连接池。

我遇到的问题是无法关闭我的Hibernate会话,并且我很快超过了“ hibernate.c3p0.max_size”属性中配置的最大打开连接数。

我认为这是因为我的hibernate会话已打开但从未关闭。我正在从存储在ServletContext中的SessionFactory打开Sessions。我尝试在Action类的finally
{}块中关闭会话,但这会引发org.hibernate.LazyInitializationException异常。

我进行了一些研究,发现了“ 完全hibernate插件”方法以及“
视图中开放会话”方法。

我假设这是一个普遍的问题,我想对最常用的解决方案有所了解。

我注意到的另一件事是Full Hibernate Plugin支持Struts
2.0.9+至2.1.6,但是我使用的是2.2.1.1。不知道这是一个问题还是网站没有更新以列出较新的版本。

非常感谢任何输入。


阅读 234

收藏
2020-06-20

共1个答案

一尘不染

我从未使用过hibernate插件,但我鼓励您采用 View中Open Session 模式。您肯定要关闭会话。

解决此问题的最常用方法之一是在请求开始时创建会话,将其存储在本地线程中,然后在请求结束时关闭会话。这可以通过Struts拦截器或Servlet过滤器完成。基本上:

public class HibernateSessionInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(final ActionInvocation invocation) throws Exception {
        try {
            // create the session and place it in the ThreadLocal
            return invocation.invoke();
        } finally {
            // close the session and remove it from the ThreadLocal
        }
    }
}

如果您使用Google Guice,则有一个基于JPA的持久性插件(guice-persist)。它使用相同的方法,但带有servlet过滤器。

2020-06-20