java – SpringMVC Hibernate Tomcat泄漏内存?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – SpringMVC Hibernate Tomcat泄漏内存?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8085字,纯文字阅读大概需要12分钟。
内容图文
![java – SpringMVC Hibernate Tomcat泄漏内存?](/upload/InfoBanner/zyjiaocheng/954/f2186edee4084aa6bea4fd7f2393a87e.jpg)
当我关闭我的webApp时. Tomcat不断显示SEVERE警告:
02-Mar-2014 23:07:30.890 SEVERE [http-apr-8080-exec-4] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks The web application [/movie-collection-0.0.2] created a ThreadLocal with
key of type [com.microsoft.sqlserver.jdbc.ActivityCorrelator$1] (value [com.microsoft.sqlserver.jdbc.ActivityCorrelator$1@520a38a8]) and a value of type [com.microsoft.sqlserver.jdbc.ActivityId] (val
ue [3488cbb4-f0e2-4505-93c4-78248b161847-2]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
02-Mar-2014 23:07:30.891 SEVERE [http-apr-8080-exec-4] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks The web application [/movie-collection-0.0.2] created a ThreadLocal with
key of type [com.microsoft.sqlserver.jdbc.ActivityCorrelator$1] (value [com.microsoft.sqlserver.jdbc.ActivityCorrelator$1@520a38a8]) and a value of type [com.microsoft.sqlserver.jdbc.ActivityId] (val
ue [ba8aeba9-de9e-49de-8732-5290ae65167b-0]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
02-Mar-2014 23:07:31.848 INFO [http-apr-8080-exec-4] org.apache.catalina.startup.HostConfig.undeploy Undeploying context [/movie-collection-0.0.2]
我清楚地看到描述问题原因的信息.但经过5个小时的努力,我仍然无法消除它.这是我的持久性配置:
@Configuration
@EnableTransactionManagement
@PropertySource("classpath:application.properties")
public class PersistenceContext {
private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";
private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql";
private static final String PROPERTY_NAME_HIBERNATE_USE_SQL_COMMENT = "hibernate.use_sql_comments";
private static final String PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY = "hibernate.ejb.naming_strategy";
private static final String PROPERTY_NAME_JDBC_BATCH_SIZE = "hibernate.jdbc.batch_size";
private static final String PROPERTY_NAME_CACHE_PROVIDER_CLASS = "hibernate.cache.provider_class";
private static final String PROPERTY_NAME_C3P0_MIN_SIZE = "hibernate.c3p0.min_size";
private static final String PROPERTY_NAME_C3P0_MAX_SIZE = "hibernate.c3p0.max_size";
private static final String PROPERTY_NAME_C3P0_TIMEOUT_SIZE = "hibernate.c3p0.timeout";
private static final String PROPERTY_NAME_C3P0_MAX_STATEMENTS_SIZE = "hibernate.c3p0.max_statements";
private static final String PROPERTY_NAME_C3P0_IDLE_TEST_PERIOD_SIZE = "hibernate.c3p0.idle_test_period";
private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";
@Resource
private Environment environment;
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
dataSource.setUrl(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
dataSource.setUsername(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
dataSource.setPassword(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
return dataSource;
}
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setHibernateProperties(getHibernateProperties());
sessionFactory.setPackagesToScan(environment.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
return sessionFactory;
}
@Bean
public HibernateTransactionManager transactionManager() {
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory().getObject());
return transactionManager;
}
private Properties getHibernateProperties() {
Properties props = new Properties();
props.put(PROPERTY_NAME_HIBERNATE_DIALECT, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
props.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
props.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));
props.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY));
props.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
props.put(PROPERTY_NAME_HIBERNATE_USE_SQL_COMMENT, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_USE_SQL_COMMENT));
props.put(PROPERTY_NAME_JDBC_BATCH_SIZE, environment.getRequiredProperty(PROPERTY_NAME_JDBC_BATCH_SIZE));
props.put(PROPERTY_NAME_CACHE_PROVIDER_CLASS, environment.getRequiredProperty(PROPERTY_NAME_CACHE_PROVIDER_CLASS));
props.put(PROPERTY_NAME_C3P0_MIN_SIZE, environment.getRequiredProperty(PROPERTY_NAME_C3P0_MIN_SIZE));
props.put(PROPERTY_NAME_C3P0_MAX_SIZE, environment.getRequiredProperty(PROPERTY_NAME_C3P0_MAX_SIZE));
props.put(PROPERTY_NAME_C3P0_TIMEOUT_SIZE, environment.getRequiredProperty(PROPERTY_NAME_C3P0_TIMEOUT_SIZE));
props.put(PROPERTY_NAME_C3P0_MAX_STATEMENTS_SIZE, environment.getRequiredProperty(PROPERTY_NAME_C3P0_MAX_STATEMENTS_SIZE));
props.put(PROPERTY_NAME_C3P0_IDLE_TEST_PERIOD_SIZE, environment.getRequiredProperty(PROPERTY_NAME_C3P0_IDLE_TEST_PERIOD_SIZE));
return props;
}
}
我的财产:
#Database Configuration
db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
db.url=jdbc:sqlserver://localhost;integratedSecurity=true;databaseName=Abc
db.username=""
db.password=""
#Hibernate Configuration
hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
hibernate.cache.provider_class=org.hibernate.cache.internal.NoCachingRegionFactory
hibernate.hbm2ddl.auto=validate
hibernate.jdbc.batch_size=50
#Connection pool config
hibernate.c3p0.min_size=2
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=300
hibernate.c3p0.max_statements=50
hibernate.c3p0.idle_test_period=3000
#SQL output format
hibernate.format_sql=true
hibernate.show_sql=true
hibernate.use_sql_comments=false
#Declares the base package of the entity classes
entitymanager.packages.to.scan=com.adc.domain
我很感激任何想法.
UPDATE
我添加了ServletContextListener和适当的侦听器来取消注册JDBC驱动程序.仍然没有结果……
我想我必须找到一种方法来清除那些ThreadLocals
public class DbConnectionCleaner implements ServletContextListener {
private static final Logger log = LogManager.getLogger(DbConnectionCleaner.class);
@Override
public void contextInitialized(ServletContextEvent sce) {
log.info("Servlet context initialized");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
log.info("Cleaning DB connections");
Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
Driver driver = drivers.nextElement();
try {
DriverManager.deregisterDriver(driver);
log.info(String.format("Deregistering jdbc driver: %s", driver));
} catch (SQLException ex) {
log.error(String.format("Error deregistering driver %s", driver), ex);
}
}
}
}
解决方法:
如果你的JDBC驱动程序的JAR文件在Tomcat的lib /目录中,那么应该没有泄漏:你不会将WebappClassLoader固定在内存中.另请注意,Tomcat通过回收(即销毁和重新创建)线程池中的所有线程来保护您免受此问题的影响,以删除绑定到它们的ThreadLocals.
说实话,这是JDBC驱动程序中的一个错误:执行终止后,没有ThreadLocals应该保持绑定到任何线程.您可能需要与Microsoft核实,看看他们是否有更新来解决此问题.您还可以检查是否正在使用某种需要使用ThreadLocal的功能 – 与“活动相关器”有关.如果禁用该功能,则可以避免该错误.
内容总结
以上是互联网集市为您收集整理的java – SpringMVC Hibernate Tomcat泄漏内存?全部内容,希望文章能够帮你解决java – SpringMVC Hibernate Tomcat泄漏内存?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。