环境-Grails 2.0.4,Oracle 11G
几个小时不 Activity 之后,从数据库中读取会导致 java.net.SocketException:连接超时。基于解决该问题的其他建议,我使用属性更新dataSource来保持数据库连接处于 Activity 状态。这是我研究过的几种解决方案-
One solution
Another solution
看来解决方案涉及在数据源上设置适当的值。就我而言,涉及2个数据源。我正在尝试进行 session 保持 Activity ,以避免连接超时。这似乎是通过设置validationQuery属性和testXXX属性来完成的。需要测试时,将运行验证查询。我以为下面的配置会给我想要的结果,但是我仍然看到超时。我加快了调试速度
debug 'org.hibernate'
debug 'jdbc.sqlonly'
我本来希望看到validateQuery以一定的间隔运行。基于指定的“6000” ms值,我希望每6秒钟看到一次validationQuery。这是数据源规范。我尝试了两种方法。在“属性”闭包中指定它们,并在与“合并”相同的级别上指定它们。
dataSource_secondary {
logSql = true
pooled = true
properties {
maxActive = 5
maxIdle = 5
minIdle = 3
initialSize = 5
minEvictableIdleTimeMillis = 6000
timeBetweenEvictionRunsMillis = 6000
maxWait = 1000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
validationQuery = "select 1 from dual"
}
}
我还在调试器中运行了此脚本,并向BootStrap.groovy添加了一些代码来获取上下文。
def ctx = servletContext.getAttribute(ApplicationAttributes.APPLICATION_CONTEXT)
println 'Added a println allowing me to set a break point and inspect the context.'
“ctx”确实具有dataSource_secondary中指定的期望值。为什么我仍然会收到套接字异常的任何想法?
最佳答案
找出问题所在。死了的开发人员。我忽略了检入该修补程序,但它没有进入我们的构建环境所引发的 war 。一旦我检查了Datasource.groovy,一切都变得异常了,今天早上我没有看到超时异常。上述解决方案有效。
我仍然很困惑,为什么在运行validateQuery时没有看到调试消息。有谁知道适当的log4j条目以在日志中查看validationQuery?