我在一个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 ...
我已经通过使用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(); } } }