2012-01-11 2 views
2

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

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

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

Я хотел бы сделать единый экземпляр фабрики сеансов hibernate доступным для всех контекстов, я думаю, что это можно сделать с использованием глобального ресурса 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 [email protected] 
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 
... 

ответ

2

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

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(); 
     } 
    } 

} 
Смежные вопросы