使用Struts存储Hibernate SessionFactory

时间:2011-04-16 16:27:44

标签: hibernate struts2

我开始使用Hibernate和Struts 2进行相对简单的Web项目。出于性能原因,我知道建议最小化创建Hibernate Configuration和SessionFactory对象的次数。

任何人都可以提供一些关于这是否是一种好方法或者是否有更好方法的意见?我的基础代码是example I found here

方法是在ServletContextListener的contextInitialized方法中创建SessionFactory并将其存储在ServletContext中。

我注意到这个例子似乎没有关闭SessionFactory所以我在contextDestroyed中添加了一些代码。这有必要吗?

非常感谢任何输入。如果你能提出更好的例子,我很乐意看看它们。我也看过一些Struts的“Full Hibernate插件”的引用。这是一种常用且更好的方法吗?

FWIW,我正在使用Eclipse并使用MySQL部署到Tomcat

public class HibernateListener implements ServletContextListener {

private Configuration config;
private SessionFactory sessionFactory;
private String path = "/hibernate.cfg.xml";

public static final String KEY_NAME = HibernateListener.class.getName();

@Override
public void contextDestroyed(ServletContextEvent arg0) {
    if ( sessionFactory != null ) {
        sessionFactory.close();
    }

}

@Override
public void contextInitialized(ServletContextEvent arg0) {
    try {
        URL url = HibernateListener.class.getResource(path);
        config = new Configuration().configure(url);
        sessionFactory = config.buildSessionFactory();

        // save the Hibernate session factory into serlvet context
        arg0.getServletContext().setAttribute(KEY_NAME, sessionFactory);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

}

这是我添加到web.xml的内容

    <listener>
    <listener-class>insert.package.name.here.HibernateListener</listener-class>
</listener>

1 个答案:

答案 0 :(得分:4)

您的方法可行,ServletContextListener是处理您的webapp的启动和关闭任务的正确位置。在关闭时关闭SessionFactory是正确的 - 在自己养成习惯之后进行清理。

要考虑的另一件事是如何创建和处理会话。不应跨线程共享会话,也不应在每个单个数据库任务上创建和销毁它们。一种常见的最佳实践是每个请求有一个会话(通常存储在ThreadLocal中)。这通常被称为在视图中打开会话模式。

就个人而言,我对Google Guice使用了稍微修改过的guice-persist扩展版本。