hibernate sessionfactory作为全局jndi资源

时间:2012-01-11 11:07:25

标签: hibernate tomcat jndi ehcache

我有一个在一个tomcat实例中运行的多个上下文,每个上下文都需要访问同一个数据库。

我遇到了兑现问题,因为目前每个上下文都有自己的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 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 个答案:

答案 0 :(得分: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();
        }
    }

}