После устранения нескольких проблем, связанных с PermGen, в веб-приложении Java, я достиг следующего пункта:
- приложение работает в Tomcat 6.0.32 и использует управляемый Tomcat
DataSource
DataSource
определяется в $TOMCAT_HOME/conf/context.xml
- , когда приложение запускается, оно просматривает
DataSource
и только в это время создается экземпляр DataSource
; - Реализация
BasicDataSource
из commons-dbcp загружает класс GenericObjectPool
, который, в свою очередь, запускает java.util.Timer
- Таймер запускает
TimerThread
, который является корнем GC и загружается из Интернета.загрузчик классов приложения.
стек создания таймера
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)
Таймер, отображаемый как загружаемый загрузчиком классов веб-приложения
Сначала я попросил Tomcat с нетерпением инициализировать DataSource
, закрепив его в обычном загрузчике классов, но я не нашел способа сделать это.Я, конечно, открыт для других способов решения этой проблемы (но ресурс, связанный с JNDI, должен остаться).
Как я могу убедиться, что TimerThread
связан с загрузчиком классов веб-приложения?