Принудительная инициализация источника данных с обработкой Tomcat - PullRequest
0 голосов
/ 12 мая 2011

После устранения нескольких проблем, связанных с 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)

Таймер, отображаемый как загружаемый загрузчиком классов веб-приложения

GC Roots

Сначала я попросил Tomcat с нетерпением инициализировать DataSource, закрепив его в обычном загрузчике классов, но я не нашел способа сделать это.Я, конечно, открыт для других способов решения этой проблемы (но ресурс, связанный с JNDI, должен остаться).

Как я могу убедиться, что TimerThread связан с загрузчиком классов веб-приложения?

1 Ответ

0 голосов
/ 21 октября 2011

Я не уверен, что понял: вы хотите, чтобы ваш DataSource был загружен ровно один раз?Поместите его в ваш server.xml как GlobalNamingResource.Ссылка на это в ваших веб-приложениях из context.xml.(см. здесь http://tomcat.apache.org/tomcat-5.5-doc/config/globalresources.html для получения дополнительной информации)

Вы хотите, чтобы он был загружен для одного веб-приложения: поместите его в контекст веб-приложений xml.

Имеется в виду tomcats context.xmlсодержать ресурсы, которые должны быть загружены для всех веб-приложений один раз.(поэтому наличие 5 веб-приложений приводит к 5 экземплярам.)

Если это не помогло, пожалуйста, опубликуйте свой tomcats и контекст веб-приложений в xml.

...