【发布时间】:2011-12-24 23:48:50
【问题描述】:
我的 Rails 应用程序设置如下:
- Rails:3.0.5(在 Apache 代理下)在 RHEL 5.6 上运行
- Postgres:8.4,在 Windows Server 2008 上运行 两台服务器在同一个局域网上。
问题是,在闲置一段时间后,当我向 Rails 应用程序发出新请求时,它给了我以下错误:
ActiveRecord::StatementInvalid (PGError: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
根据我的研究,似乎数据库连接在 Postgres 超时后断开。在此期间,从 Rails 方面,
- 如果我向 Rails 发出请求(第一次请求),它将显示如上的连接错误
- 如果我向 Rails 发出另一个请求(第二次请求),Rails 似乎重新连接到 Postgres 并正常运行。
这意味着我总是会遇到第一个连接错误,然后将再次进行所有正常操作,这在我的情况下非常严重,因为我想向我的客户提供非错误响应。
我查看了以下问题和答案,但它们似乎不适合我的情况:
- "PGError: no connection to the server" after idle(用于数据库服务器的 Ubuntu)
- How to use tcp_keepalives settings in Postgresql?(MacOS 中的keepalives)
您有什么建议可以让我的应用免受数据库连接错误的影响吗?谢谢。
【问题讨论】:
-
我在使用 postgresql 和 heroku 时遇到同样的错误
-
连接消失是正常的。 Rails 如此不礼貌地对待它是不正常的。检查您的数据库驱动程序(适配器)对
verify!和active?的实现;通常ActiveRecord::ConnectionAdapters::ConnectionPool使适配器有机会在将任何陈旧连接从池中检出之前立即重新连接它。您将哪个 gem 用于 Postgres?
标签: ruby-on-rails windows postgresql timeout connection