在Tomcat中干净地取消部署Grails应用程序

在Tomcat中干净地取消部署Grails应用程序,tomcat,grails,profiling,classloader,Tomcat,Grails,Profiling,Classloader,我认为,每次我重新部署应用程序时,旧的webclassloader都会被保留下来,因为一个名为Timer-0的阻塞线程是由hibernate启动的。 我试图用YourKit分析堆转储,但仍有数千个End类被加载,我很难找出是什么阻止了类加载程序 这给我留下了几个问题: 如何找到类加载器无法卸载的原因 是否有一个最佳实践来确保在不重新启动容器的情况下完全卸载所有内容 提前谢谢 更新 示例数据源: dataSource { pooled = true driverClassNam

我认为,每次我重新部署应用程序时,旧的webclassloader都会被保留下来,因为一个名为Timer-0的阻塞线程是由hibernate启动的。 我试图用YourKit分析堆转储,但仍有数千个End类被加载,我很难找出是什么阻止了类加载程序

这给我留下了几个问题:

  • 如何找到类加载器无法卸载的原因

  • 是否有一个最佳实践来确保在不重新启动容器的情况下完全卸载所有内容

提前谢谢

更新

示例数据源:

dataSource {
    pooled = true
    driverClassName = "org.postgresql.Driver"
    dialect = "org.hibernate.dialect.PostgreSQLDialect"
    username = "xx"
    password = "xx"
    configClass = DdlFilterConfiguration
    properties {
        maxActive = 250
        maxIdle = 25
        minIdle = 1
        initialSize = 10
        maxWait = 10000
        validationQuery = "select 1 "
        validationQueryTimeout = 3
        validationInterval = 15000
        testOnReturn = true
        testWhileIdle = true
        testOnBorrow = true

        minEvictableIdleTimeMillis = 60000
        timeBetweenEvictionRunsMillis = 5000
    }
}

最好的方法可能是在系统前端安装一个代理(Apache代理工作得很好)。即使在同一台机器上,您也可以有两个Tomcat实例,但是在不同的端口上,比如7001和8001。假设您当前正在端口7001上运行,在8001上启动新部署,然后将代理重新指向8001。

否,请重新启动容器:/我已经使用Tomcat7和Grails成功地完成了并行部署。这就像没有任何停机时间的重新部署。您的数据库连接池怎么样?@Joshuamore我认为可能有一种方法可以避免这种情况,因为这个容器中运行的应用程序可能依赖于24/7正常运行时间。@Joe有几个数据源与不同的驱动程序(Informix、Postgres)共享。我已经用我们使用的配置更新了这个问题。