【发布时间】:2012-07-31 20:11:30
【问题描述】:
环境 - Grails 2.0.4,Oracle 11G
在几个小时不活动后,从数据库读取会导致 java.net.SocketException: Connection timed out。根据其他人提出的解决此问题的建议,我使用属性更新数据源以保持数据库连接处于活动状态。这是我看过的几个解决方案-
似乎解决方案涉及在数据源上设置适当的值。就我而言,涉及 2 个数据源。我正在尝试进行会话保持活动,以避免连接超时。这似乎是通过设置 validationQuery 属性和 testXXX 属性来完成的。当需要测试时,将运行验证查询。我认为下面的配置会给我想要的结果,但我仍然看到超时。我加快了调试速度
debug 'org.hibernate'
debug 'jdbc.sqlonly'
我本来希望validationQuery 会在某个时间间隔运行。根据指定的“6000”毫秒值,我希望每 6 秒看到一次验证查询。这是数据源规范。我尝试了这两种方法。在“properties”闭包中指定它们,并将它们指定在与“pooled”相同的级别。
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 中指定的预期值。任何想法为什么我仍然收到套接字异常?
【问题讨论】: