Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Struts存储Hibernate SessionFactory_Hibernate_Struts2 - Fatal编程技术网

用Struts存储Hibernate SessionFactory

用Struts存储Hibernate SessionFactory,hibernate,struts2,Hibernate,Struts2,我开始将Hibernate与Struts 2结合使用,用于一个相对简单的web项目。出于性能原因,我知道建议尽量减少创建Hibernate配置和SessionFactory对象的时间 是否有人能提供一些信息,说明这是一个好方法,或者是否有更好的方法?我把这个密码建立在一个 方法是在ServletContextListener的contextInitialized方法中创建SessionFactory,并将其存储在ServletContext中 我注意到该示例似乎从未关闭SessionFactor

我开始将Hibernate与Struts 2结合使用,用于一个相对简单的web项目。出于性能原因,我知道建议尽量减少创建Hibernate配置和SessionFactory对象的时间

是否有人能提供一些信息,说明这是一个好方法,或者是否有更好的方法?我把这个密码建立在一个

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

我注意到该示例似乎从未关闭SessionFactory,因此我在ContextDistromed中添加了一些代码。这有必要吗

非常感谢您的意见。如果你能提出更好的例子,我很乐意看看。我还看到一些关于Struts的“完整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>

insert.package.name.here.HibernateListener

您的方法会起作用,
ServletContextListener
s是处理Web应用程序启动和关闭任务的正确位置。关闭时关闭
会话工厂
是正确的-事后清理是一个好习惯

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


就我个人而言,我使用的是谷歌guice的guice持久化扩展的一个稍加修改的版本。

感谢您的回复。我很感激。我会去谷歌Guice看看。我以前没听说过。