2012-01-11 6 views
2

1つのTomcatインスタンスで複数のコンテキストを実行しており、各コンテキストで同じデータベースにアクセスする必要があります。グローバルjndiリソースとしてのhibernate sessionfactory

各コンテキストは、現時点では休止状態とにehcacheの独自のインスタンスを持っているので、私は現金化の問題に実行しています。

これは、hibernateとehcacheの1つのインスタンスでなければならないと思われます。これは、パフォーマンスも向上します。

私はすべてのコンテキストへのHibernateセッションファクトリの単一のインスタンスを使用できるようにしたいと思い、私は、これはTomcatのではグローバルJNDIリソースを使用して行うことができると思います。

これはこの問題を解決する良い方法ですか?

また、誰かがこれを行う方法を学ぶための良いリソースを提供できる場合は、非常に感謝します。

アップデート:私は、グローバルJNDIにセッションファクトリをバインドするために管理しているが、ConcurrentModificationExceptionがは、Tomcatの起動時にログに表示されます。

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

} 
関連する問題