Heroku + Rails + PG: ActiveRecord::StatementInvalid (PG::ConnectionBad: PQconsumeInput() SSL connection has been closed unexpectedly) 在使用Heroku、Rails和PG的过程中,出现了活动记录错误:ActiveRecord::StatementInvalid (PG::ConnectionBad: PQconsumeInput() SSL连接意外关闭)。

11

我在日志中随机频繁地收到以下错误:

Nov 06 05:31:21 lmrapp app/web.2:  [wbinternacional] [0f0965e3-e537-4aed-8f3e-311a222e8fa1] PG::ConnectionBad: PQconsumeInput() SSL connection has been closed unexpectedly 
Nov 06 05:31:21 lmrapp app/web.2:  [wbinternacional] [0f0965e3-e537-4aed-8f3e-311a222e8fa1] Completed 500 Internal Server Error in 23ms 
Nov 06 05:31:21 lmrapp app/web.2:  FATAL:  terminating connection due to administrator command 
Nov 06 05:31:21 lmrapp app/web.2:  ActiveRecord::StatementInvalid (PG::ConnectionBad: PQconsumeInput() SSL connection has been closed unexpectedly 

这可能是由于我在Heroku的Pg计划连接数限制引起的(我有“Hobby-basic”计划,最多可以有20个连接)吗?

谢谢。


请打开问题并提交到Heroku的支持中心,然后在此处提供链接。是的,好的。 - Малъ Скрылевъ
2个回答

19

我遇到了完全相同的错误。我也使用的是Heroku Hobby-basic db。我向Heroku提出了一个工单,他们的回答如下:

"SSL connection has been closed unexpectedly"(以及其他几个类似的)错误是客户端错误,表示数据库连接已断开。Hobby级别的数据库有一个限制,即未经宣布的维护。我们偶尔需要关闭一些连接到Hobby级别数据库的连接,当我们这样做时,应用程序通常会看到像这样的错误。

大多数维护连接池的应用程序(如Rails中的ActiveRecord)可以只打开一个新的连接到数据库。然而,在某些情况下,应用程序将无法重新连接。如果发生这种情况,您可以heroku restart该dyno,以获取一个在新运行时上的新进程。

通常不建议在生产环境中使用Hobby级别的数据库。但是,如果您要这样做,则有助于将您的应用程序配置为在重复的数据库连接错误上实际崩溃-这样,它将自动启动一个具有新连接池的新运行时。

看起来这种情况对你来说经常发生;在这种情况下,我建议您使用pgbackups:transfer将数据库移动到另一个共享服务器。请记住,Hobby级别规则适用于$9基本计划和免费数据库。如果您有任何进一步的问题,请告诉我。谢谢!

对我来说,这基本上意味着Heroku不打算修复此错误,并希望您升级到$50的数据库。现在我正在运行一个小网站,每天只有4-5个用户-我绝不想立即切换到生产网站。我至少每天遇到与您提到的相同错误5-6次,并且仍然没有找到解决方法。尝试将您的db切换到另一个共享服务器-对我不起作用。


是的,我最终不得不升级到50美元的Postgres计划。之后错误就再也没有出现了。 - Martin B.
1
我不会对此太肯定。我使用的是50美元的计划,偶尔也会看到这个错误。当然,很少见,但它仍然存在。 - Jerry

1
我经常遇到这个问题,非常烦人。特别是当你想要构建一个应用程序但不想在开发阶段支付50美元/月时。我注意到最大的帮助是确保在开发过程中没有像DB Visualizer或另一个DBMS这样的东西在运行。我知道这似乎是违反直觉的,但肯定有助于保持数据库池的自由。

此外,如果您正在运行RoR,可以尝试将pool:1添加到默认连接字符串中,以确保您的应用程序不会尝试连接到Heroku上允许的postgres更多次数。

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 1

希望这能帮助一些人!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接