我在一台机器上运行两个Web应用程序,在另一台机器上运行一个DB。(它们使用相同的数据库) 一个人可以跑得很好,但另一个人在大约4个小时后总是跑步。
以下是错误信息:
Error 2014-11-03 13:31:05,902 [http-bio-8080-exec-7] ERROR spi.SqlExceptionHelper - An I/O error occured while sending to the backend.
| Error 2014-11-03 13:31:05,904 [http-bio-8080-exec-7] ERROR spi.SqlExceptionHelper - This connection has been closed.
Postgresql日志:
2014-10-26 23:41:31 CDT WARNING: pgstat wait timeout
2014-10-27 01:13:48 CDT WARNING: pgstat wait timeout
2014-10-27 03:55:46 CDT LOG: could not receive data from client: Connection timed out
2014-10-27 03:55:46 CDT LOG: unexpected EOF on client connection
谁造成了这个问题,应用程序或数据库?或网?
答案 0 :(得分:1)
原因:
此时很明显,闲置的TCP连接已经断开,但我们的应用程序仍然认为它是开放的。通过空闲连接,我的意思是池中的连接目前尚未被应用程序主动使用。
经过一番搜索后,我得出的结论是,我的应用程序和数据库之间的网络防火墙在1小时后丢弃了空闲/过时的连接。这似乎是许多人面临的一个普遍问题。
解决方案:
在Grails中,您可以在DataSource.groovy中设置它。
environments {
development {
dataSource {
//configure DBCP
properties {
maxActive = 50
maxIdle = 25
minIdle = 1
initialSize = 1
minEvictableIdleTimeMillis = 60000
timeBetweenEvictionRunsMillis = 60000
numTestsPerEvictionRun = 3
maxWait = 10000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
validationQuery = "SELECT 1"
}
}
}
}