Grails数据源 - 生产中的空闲连接

时间:2014-11-20 18:53:53

标签: hibernate postgresql grails

我正在开发一个使用PostgreSQL作为数据库的grails应用程序。在本地计算机(Windows)上以开发模式执行数据库操作时,一切正常(池,空闲连接清理等)。

当我构建war文件并将其部署在tomcat(linux机器)上时,会出现问题。一旦我开始使用应用程序,数据库连接就不会从db中清除,而是保持空闲状态。

当我检查数据库及其查询的连接时,我看到数百个“COMMIT”和“COMMIT TRANSACTION”查询处于空闲状态并且没有得到清理。

此外,所有数据源配置都未应用于远程计算机上。

任何帮助都会受到欢迎,因为我尝试了很多选择,但问题仍然存在。

更新1:

Grails版本:2.2.3 Hibernate版本:2.2.3

dataSource {        
    pooled = true
    dialect = "org.hibernate.dialect.PostgreSQLDialect"
    driverClassName = "org.postgresql.Driver"
}
    hibernate {
    cache.use_second_level_cache=true
    cache.use_query_cache=true
    cache.provider_class='net.sf.ehcache.hibernate.EhCacheProvider'
}
environments { 
development {
    dataSource {
        logSql=false
        dbCreate = "none"
        dialect = "org.hibernate.dialect.PostgreSQLDialect"
        driverClassName = "org.postgresql.Driver"
        properties {
            initialSize = 3
            maxActive = 100
            maxIdle = 50
            minIdle = 10
            minEvictableIdleTimeMillis=1000
            timeBetweenEvictionRunsMillis=2000
            numTestsPerEvictionRun=3
            testOnBorrow=true
            testWhileIdle=true
            testOnReturn=false
            validationQuery="SELECT 1"
            removeAbandoned = true
            removeAbandonedTimeout = 54
        }
    }
} 
}

经过一些测试后,我发现这些设置根本没有应用。无论环境是开发还是生产。在开发环境中,我可以看到pg_stat_activity查询连接正在以50旋转(当连接数达到50时,它进行清理),而在生产中,连接根本没有被清理,当它们达到max_connections值时,我得到“客户太多“错误。

使用pg_stat_activity检查我可以看到大多数查询是:

  • COMIT
  • COMIT TRANSACTION
  • SET extra_float_digits = 3

更新2:

最后我发现该问题与延迟的数据源解决方法http://burtbeckwith.com/blog/?p=312有关。

我没有将DelayedSessionFactoryBean添加到我的代码中,这就是为什么hibernate没有动态设置配置。

0 个答案:

没有答案