gpt4 book ai didi

ruby-on-rails - Heroku - ActiveRecord::ConnectionTimeoutError(无法在 5.000 秒内获得数据库连接(等待 5.000 秒))

转载 作者:行者123 更新时间:2023-11-29 11:50:14 26 4
gpt4 key购买 nike

我有一个相当简单的应用程序,它在本地运行没有问题,但是当部署到 heroku 时,它很快停止工作,出现 500 错误,日志中出现以下错误:

ActiveRecord::ConnectionTimeoutError (could not obtain a database connection within 5.000 seconds (waited 5.003 seconds))

我四处搜索并找到了 this question这看起来非常相似。从这个问题中我真的不明白请求 jpeg 文件的相关性是什么,而且我不明白给出的答案中的问题是什么。我可以通过重新启动服务器然后调用多次返回 404 的页面来重新创建。

我得到的结果与问题中提到的结果相同(特别是 Connections < DB_POOL):

 (staging) $ heroku pg:info --remote staging
=== HEROKU_POSTGRESQL_ONYX_URL (DATABASE_URL)
Plan: Hobby-dev
Status: Available
Connections: 5
PG Version: 9.3.4
Created: 2014-05-02 08:57 UTC
Data Size: 9.9 MB
Tables: 11
Rows: 6508/10000 (In compliance)
Fork/Follow: Unsupported
Rollback: Unsupported

(staging) $ heroku config
.....
DB_POOL: 10
.....

我基于这个 railscast 开发了我的解决方案这似乎与另一个问题中的方法相同。但是,我不理解另一个问题中提供的答案以及它如何适用于我的解决方案,如下所示: 路线.rb:

match ':status', to: 'errors#show', constraints: {status: /\d{3}/ }, via: :all

应用.rb:

config.exceptions_app = self.routes

错误 Controller .rb

class ErrorsController < ApplicationController

def show
status = request.path[1..-1]
case status
when "404"
@error = "404 - The page you were looking for cannot be found"
when "403"
@error = "403 - The page you were looking for is not accessible"
when "500"
@error = "500 - An error occurred within the server"
end


respond_to do |format|
format.html { render action: "error" }
format.json { render json: {status: status, error: @exception.message} }
end
end
end

错误.html.erb

<div class='container'>
<h1 class="errorh1">Oops something went wrong!!</h1>
<h2 class="errorh2"><%= @error %></h2>
<br>
<p>We are sorry. Please <a href='#' data-uv-trigger="contact
">let us know</a> what you were trying to do so that we can look into the problem.</p>
<br>
<p>When you are ready to continue, <a href="/">go home</a> to start again.</p>
</div>

注意:我在本地运行 Rails 4.0.4(和 psql (PostgreSQL) 9.3.4)

最佳答案

我不认为你的 ErrorsController 有任何问题,无论你放它还是使用默认的,这个问题都会存在。

ActiveRecord::ConnectionTimeoutError 只是意味着数据库已经占用了所有的连接并且它进一步不能接受任何连接。

发生这种情况的可能原因很少。您可能会在某些action 中执行耗时的query transaction。可能您正在使用像 puma 这样的多线程服务器或像 unicorn 这样的多进程服务器(并且您错过了添加所需的配置)。也有可能出现dead connection,一直占用资源但不丢失(很像deadlock)

除非您想将数据库升级到非常大的计划,否则没有解决此问题的关键解决方案。

我建议您添加 https://github.com/heroku/rack-timeout这将在请求时引发 Racke::Timeout 异常(内部数据库需要更长的时间来响应)。您可以拯救这个异常,或者让它继续发生。 newrelicairbrake 可能会帮助您了解它发生的地点和原因。

我想在大型应用程序中添加一件事,大量耗时的 sql 事务 也发生在面向公众的 app/site 中,但它们缓存了所有这些东西。如果您不介意复杂性,也可以使用 redismemcache 来实现。

最后一件事,如果您找不到解决方案,恐怕但一定要联系 heroku 支持。他们非常乐于助人。

关于ruby-on-rails - Heroku - ActiveRecord::ConnectionTimeoutError(无法在 5.000 秒内获得数据库连接(等待 5.000 秒)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24935193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com