2011-05-12 32 views
0

消除一對夫婦的PermGen的相關問題在Java Web應用程序我已經達到以下點之後:迫使Tomcat的處理數據源進行初始化熱切

  • 應用到Tomcat 6.0.32和用途運行一個Tomcat管理DataSource
  • DataSource$TOMCAT_HOME/conf/context.xml
  • 定義爲當應用程序啓動時,它會查找DataSource也只有在那個時候實例化的DataSource;
  • 從公地DBCP加載BasicDataSource實施GenericObjectPool類,後者又開始java.util.Timer
  • 定時器啓動TimerThread這是一個GC根,並通過Web應用程序類加載器加載。

定時器產生的堆棧跟蹤

java.util.Timer.<init>(Timer.java:123) 
org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.<clinit>(GenericObjectPool.java:268) 
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1172) 
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880) 
org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81) 
org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:114) 
org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2163) 
org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2159) 
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1383) 
org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954) 
org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:855) 
org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:774) 
org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211) 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 

計時器顯示爲通過web應用程序的類加載器加載

GC Roots

我的第一個雖然是問Tomcat來初始化DataSource熱切地,因此將其固定在普通的類加載器中,但是我發現沒有辦法做到這一點。我當然也可以用其他方式解決這個問題(但是JNDI綁定資源需要保留)。

如何確保TimerThread已鏈接到Web應用程序類加載器?

回答

0

我不知道我明白了: 你想要你的DataSource只加載一次嗎? 將它作爲GlobalNamingResource放入server.xml。在context.xml中的webapps中引用它。 (有關更多信息,請參閱http://tomcat.apache.org/tomcat-5.5-doc/config/globalresources.html

您希望將其加載到一個Web應用程序:將其放入webapps上下文xml中。

tomcats context.xml旨在包含應爲所有webapps加載一次的資源。 (因此有5個webapps會導致5個實例)。

如果沒有幫助,請發佈您的tomcats和webapps上下文xml。