хранение Hibernate SessionFactory с помощью Struts - PullRequest
5 голосов
/ 16 апреля 2011

Я начинаю использовать Hibernate со Struts 2 для относительно простого веб-проекта.Из соображений производительности я знаю, что рекомендуется минимизировать время создания объектов Hibernate Configuration и SessionFactory.

Может ли кто-нибудь предоставить какие-либо сведения о том, является ли это хорошим способом сделать это или есть более подходящие подходы?Я основываю этот код на примере , который я нашел здесь .

. Подход состоит в том, чтобы создать SessionFactory в методе contextInitialized ServletContextListener и сохранить его в ServletContext.

Я заметил, что пример, кажется, никогда не закрывает SessionFactory, поэтому я добавил некоторый код в contextDestroyed.Было ли это необходимо?

Большое спасибо за любой вклад.Если вы можете предложить какие-нибудь лучшие примеры, я буду рад их рассмотреть.Я также видел некоторые ссылки на «Полный плагин спящего режима» для Struts.Это широко используемый и лучший подход?

FWIW, я использую Eclipse и развертываю в Tomcat с MySQL

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 Ответ

4 голосов
/ 16 апреля 2011

Ваш подход будет работать, и ServletContextListener s - это подходящее место для выполнения задач запуска и завершения работы вашего веб-приложения.Вы правы в том, что закрываете SessionFactory при выключении - уборка после себя - это хорошая привычка.

Еще одна вещь, которую следует учитывать, - это то, как вы создаете и утилизируете сессии.Сеансы не должны быть общими для всех потоков, а также не должны создаваться и уничтожаться в каждой задаче базы данных.Распространенной практикой является использование одного сеанса для каждого запроса (часто хранящегося в ThreadLocal).Обычно это называется шаблоном Open Session in View .

Лично я использую слегка измененную версию расширения guice-persist для Google Guice.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...