2012-01-11 65 views
2

我有一个运行在一个tomcat实例中的多个上下文,每个上下文都需要访问同一个数据库。作为全局jndi资源的hibernate sessionfactory

我遇到了兑现问题,因为每个上下文都有自己的hibernate和ehcache实例。

这似乎不对,他们应该只是hibernate和ehcache的一个实例,这样也会有更好的性能。

我想使一个单一的hibernate会话工厂实例可用于所有上下文,我认为这可以在tomcat中使用全局JNDI资源来完成。

这是解决此问题的好方法吗?

此外,如果任何人都可以提供任何良好的资源来学习如何做到这一点,将不胜感激。

更新:我设法将会话工厂绑定到全局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创建会话工厂对启动了单一实例解决了这个问题。

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

}