我正在开发一个使用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检查我可以看到大多数查询是:
更新2:
最后我发现该问题与延迟的数据源解决方法http://burtbeckwith.com/blog/?p=312有关。
我没有将DelayedSessionFactoryBean添加到我的代码中,这就是为什么hibernate没有动态设置配置。