使用Struts存储Hibernate SessionFactory

Jus*_*tin 5 hibernate struts2

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

任何人都可以提供一些关于这是否是一个好方法或是否有更好的方法的输入?我基于这个我在这里找到例子的代码.

方法是在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());
    }
}
Run Code Online (Sandbox Code Playgroud)

}

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

    <listener>
    <listener-class>insert.package.name.here.HibernateListener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

Ste*_*tez 4

您的方法会起作用,并且ServletContextListeners 是处理 Web 应用程序的启动和关闭任务的正确位置。你在SessionFactory关机时关闭电源是正确的——用完后清理是一个好习惯。

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

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