PostgreSQL异常:“发送到后端时发生I / O错误”

时间:2014-11-03 09:44:39

标签: postgresql grails

我在一台机器上运行两个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

谁造成了这个问题,应用程序或数据库?或网?

1 个答案:

答案 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"
            }
        }
    }
}