2012-01-11 66 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(); 
     } 
    } 

}