hibernate sessionfactory 作为全局 jndi 资源

标签 hibernate tomcat jndi ehcache

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

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

这似乎是错误的,它们应该只是 hibernate 和 ehcache 的一个实例,这也会有更好的性能。

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

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

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

更新:我已成功将 session 工厂绑定(bind)到全局 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 在启动时创建 session 工厂的单例实例解决了该问题。

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

}

关于hibernate sessionfactory 作为全局 jndi 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8818198/

相关文章:

java - 重定向到 HTTPS 时丢失请求属性

java - LDAP 过滤器查询如何工作,特别是在 Java LDAP/spring LDAP 中?

tomcat - 针对不同环境外化tomcat jdbc连接池信息

mysql - 如何使用 MySQL 防止 Hibernate 将主机名附加到用户名

java.lang.IllegalStateException : Timer already cancelled when webapp redeploys on tomcat 错误

java - 如何在 Hibernate 4 实体上设置事件监听器?

java - 运行项目时 "Unsatisfied dependency expressed through constructor parameter 0"

java - 在 Eclipse 中使用 tomcat Web 应用程序时 user.dir 不正确

java - Tomcat 无法识别 Linux 中的上下文文件

python - 将 JNDI 参数放入 WebSphere