Hibernate сессионный завод как глобальный ресурс JNDI - PullRequest
2 голосов
/ 11 января 2012

У меня несколько контекстов, запущенных в одном экземпляре tomcat, каждому контексту необходим доступ к одной и той же базе данных.

У меня проблемы с обналичиванием, потому что у каждого контекста есть свой экземпляр hibernate и ehcache.

Это кажется неправильным, они должны быть только одним экземпляром hibernate и ehcache, это также будет иметь лучшую производительность.

Я хотел бы сделать один экземпляр фабрики сеансов гибернации доступным для всех контекстов, я думаю, что это можно сделать с помощью глобального ресурса JNDI в tomcat.

Это хороший способ решить эту проблему?

Кроме того, если кто-то может предоставить какие-либо хорошие ресурсы для обучения, как это сделать, это будет очень цениться.

Обновление: мне удалось привязать фабрику сеанса к глобальному JNDI, но во время запуска tomcat в журнале появляется исключение ConcurrentModificationException.

...
INFO: schema update complete
Jan 11, 2012 2:03:19 PM org.hibernate.cache.UpdateTimestampsCache <init>
INFO: starting update timestamps cache at region: org.hibernate.cache.UpdateTimestampsCache
Jan 11, 2012 2:03:19 PM org.hibernate.cache.StandardQueryCache <init>
INFO: starting query cache at region: org.hibernate.cache.StandardQueryCache
Constructed session factory ok sf=org.hibernate.impl.SessionFactoryImpl@430e0ad7
Jan 11, 2012 2:03:19 PM org.apache.catalina.mbeans.GlobalResourcesLifecycleListener createMBeans
SEVERE: RuntimeException java.util.ConcurrentModificationException
Jan 11, 2012 2:03:19 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Jan 11, 2012 2:03:19 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.23
...

1 Ответ

2 голосов
/ 12 января 2012

Я решил проблему с помощью LifecycleListener для создания одиночного экземпляра фабрики сеансов при запуске.

import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleEvent;
import org.apache.catalina.LifecycleListener;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class SessionFactorys implements LifecycleListener  {

    private static SessionFactory sessionFactory;

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    @Override
    public void lifecycleEvent(LifecycleEvent arg0) {
        if (Lifecycle.AFTER_START_EVENT==arg0.getType()) {
            sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
        }
        if (Lifecycle.BEFORE_STOP_EVENT==arg0.getType()) {  
            sessionFactory.close();
        }
    }

}
...