使用带有嵌入式H2 db的grails Web应用程序关闭Tomcat时出现错误消息

时间:2014-05-22 16:58:54

标签: tomcat grails h2

当我关闭Tomcat时,我收到错误消息,表明有一个线程和几个线程本地未正确清理。

我的Web应用程序当前使用嵌入式H2数据库进行设置,并部署在Tomcat Web应用程序服务器上。它大约一周前成功部署在生产中。

系统信息:

OS: Ubuntu 14.04 (dev), Ubuntu 12.04 (test), Solaris 5.11 (prod)
Tomcat: 7.0.53
Java: 1.7.0_55
Grails: 2.3.8

DataSource.groovy目前看起来像这样:

dataSource {
    pooled = true
    driverClassName = "org.h2.Driver"
    username = 'myDbUserName'
    password = 'myDbPassword'
    dbCreate = 'update'
    url = "jdbc:h2:/h2db/myApp_test;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = false
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}

请注意,尽管有这些消息,Tomcat仍会正常停止,没有任何明显的延迟。所以没有必要杀死这个过程(直到现在我都不得不这样做,但这是因为我自己的代码清理不当 - 现在已经解决了)。

但是,我不喜欢有这样的错误消息。这让我担心,因为我不确定后果,例如执行hotdeploy时,或者应用程序已运行很长时间而不重新启动。是否会导致内存泄漏一段时间后累积到OutOfMemoryError?我会得到数据库锁定问题吗?其他问题?

以下是相关的错误消息(编号为便于参考):

  
      
  1. 重度:   Web应用程序[/ my-app]似乎已启动一个名为的线程   [H2 File Lock Watchdog /home/steinar/h2db/myApp_test.lock.db]但未能阻止它。   这很可能会造成内存泄漏。

  2.   
  3. 重度:   Web应用程序[/ my-app]创建了一个类型为key的ThreadLocal   [java.lang.ThreadLocal](value [java.lang.ThreadLocal@15dd7182])和类型的值   [org.apache.cxf.BusFactory.BusHolder](value [org.apache.cxf.BusFactory$BusHolder@7d471904])   但是在Web应用程序停止时无法将其删除。   线程将随着时间的推移而更新,以避免可能的内存泄漏。

  4.   
  5. 重度:   Web应用程序[/ my-app]创建了一个类型为key的ThreadLocal   [org.codehaus.groovy.grails.orm.hibernate.support.HibernatePersistenceContextInterceptor $ 1]   (value [org.codehaus.groovy.grails.orm.hibernate.support.HibernatePersistenceContextInterceptor$1@46bb95dd])   和[java.util.HashMap]类型的值(值[{}])   但是在Web应用程序停止时无法将其删除。   线程将随着时间的推移而更新,以避免可能的内存泄漏。

  6.   
  7. 重度:   Web应用程序[/ my-app]创建了一个类型为key的ThreadLocal   [org.codehaus.groovy.grails.orm.hibernate.support.HibernatePersistenceContextInterceptor $ 2]   (value [org.codehaus.groovy.grails.orm.hibernate.support.HibernatePersistenceContextInterceptor$2@456c0472])   和[java.util.HashMap]类型的值(值[{DEFAULT = 0}])   但是在Web应用程序停止时无法将其删除。   线程将随着时间的推移而更新,以避免可能的内存泄漏。

  8.   

我对这些的评论/问题:

  
      
  1. H2文件锁看门狗线程。看起来Web应用程序无法在关机时正确关闭H2。我尝试在JDBC URL中尝试使用DB_CLOSE_ON_EXIT,但所有选项(TRUEFALSE或省略它)都会为我产生相同的消息和行为。我也试过看Grails文档

  2.   
  3. 来自CXF ThreadLocal的“可能内存泄漏”?我该如何避免?我在没有此问题的其他(非grails)Web应用程序中使用CXF。是因为Grails有什么作用吗?

  4.   
  5. 和4.“可能的内存泄漏”来自ThreadLocal s,看起来像Grails的Hibernate插件。谁知道我怎么能摆脱这些?

  6.   

非常感谢您对这些错误消息或(甚至更好)解决方案的见解。

0 个答案:

没有答案