Ruby on rails Rails应用程序意外抛出错误

Ruby on rails Rails应用程序意外抛出错误,ruby-on-rails,ruby,Ruby On Rails,Ruby,这真是一件奇怪的事。我可以去同一个页面三次,三次中有一次页面会抛出错误 这在rails应用程序中是常见的吗? 这是因为我在某个地方的缓存设置不正确造成的吗 我知道这里没有太多的背景,但我觉得这是很常见的事情 我不能完全复制粘贴我的整个应用程序 我的错误日志如下: ActiveRecord::ConnectionTimeoutError (could not obtain a database connection within 5.000 seconds (waited 5.000 second

这真是一件奇怪的事。我可以去同一个页面三次,三次中有一次页面会抛出错误

这在rails应用程序中是常见的吗? 这是因为我在某个地方的缓存设置不正确造成的吗

我知道这里没有太多的背景,但我觉得这是很常见的事情

我不能完全复制粘贴我的整个应用程序

我的错误日志如下:

ActiveRecord::ConnectionTimeoutError (could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)):
  activerecord (4.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:189:in `block in wait_poll'
  activerecord (4.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:180:in `loop'
  activerecord (4.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:180:in `wait_poll'
  activerecord (4.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:135:in `block in poll'
  /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'
  activerecord (4.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:145:in `synchronize'
  activerecord (4.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:133:in `poll'
  activerecord (4.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:425:in `acquire_connection'
  activerecord (4.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:349:in `block in checkout'
  /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'

这不是Rails错误:

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

这是数据库连接的一个问题:

  • 试图加载太多数据(即在几秒钟内达到数据库1000多条记录)
  • 具有极高的延迟(较慢)连接
  • 系统上有太多打开的数据库连接(阻止加载更多连接)

解决此问题的方法是调试过程:

-

DB

您的数据库是如何托管的

我们使用一个共享主机来存储一些MYSQL数据库以供开发(我们喜欢保持精简的设置),并为生产应用程序提供现场数据库托管(相同的数据中心)

数据库服务器实际上就像请求JSON对象一样,这意味着如果您是从本地主机以外的系统请求它,则需要测量它返回的速度

您的问题可能是系统连接到数据库的时间太长,因此刷新可能会阻止它再次访问数据库。解决这个问题的唯一方法是获得一个地理位置接近的设置

我们以前在Heroku上遇到过这样的问题——使用外部MYSQL数据库大大降低了系统的速度:)

使用RackSpace之类的工具可以连接到位于同一数据中心的数据库服务器

-

数据集

从上面开始,您可能遇到的第二个问题是,您正在调用大量数据

记住,db服务器只是一台计算机,用数据回答您的请求

因此,如果您在一次调用中调用了大量数据,则处理这些数据所需的时间将非常长(防止进一步的请求被处理)

您需要现实地处理数据请求—我们倾向于在一次调用中保留100个对象,您必须避免类似瘟疫的情况

-

池大小

最后,数据库连接的池大小是另一个需要考虑的问题

您可以在此处阅读:


简而言之,您应该将db连接限制在应用程序所需的范围内。任何多余的错误都会导致问题。

这不是Rails错误:

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

这是数据库连接的一个问题:

  • 试图加载太多数据(即在几秒钟内达到数据库1000多条记录)
  • 具有极高的延迟(较慢)连接
  • 系统上有太多打开的数据库连接(阻止加载更多连接)

解决此问题的方法是调试过程:

-

DB

您的数据库是如何托管的

我们使用一个共享主机来存储一些MYSQL数据库以供开发(我们喜欢保持精简的设置),并为生产应用程序提供现场数据库托管(相同的数据中心)

数据库服务器实际上就像请求JSON对象一样,这意味着如果您是从本地主机以外的系统请求它,则需要测量它返回的速度

您的问题可能是系统连接到数据库的时间太长,因此刷新可能会阻止它再次访问数据库。解决这个问题的唯一方法是获得一个地理位置接近的设置

我们以前在Heroku上遇到过这样的问题——使用外部MYSQL数据库大大降低了系统的速度:)

使用RackSpace之类的工具可以连接到位于同一数据中心的数据库服务器

-

数据集

从上面开始,您可能遇到的第二个问题是,您正在调用大量数据

记住,db服务器只是一台计算机,用数据回答您的请求

因此,如果您在一次调用中调用了大量数据,则处理这些数据所需的时间将非常长(防止进一步的请求被处理)

您需要现实地处理数据请求—我们倾向于在一次调用中保留100个对象,您必须避免类似瘟疫的情况

-

池大小

最后,数据库连接的池大小是另一个需要考虑的问题

您可以在此处阅读:


简而言之,您应该将db连接限制在应用程序所需的范围内。任何多余的线程都会导致问题。

不,这不是常见的情况。哦,这很可怕。您可能会因为线程太多(如果您使用的是线程服务器,如Puma)和连接池太小而耗尽数据库连接池。请发布你的
数据库.yml
和你的Rails服务器配置。这也会帮助你加载什么页面。控制器代码和模板可能会有所帮助。不可能重复,这不是常见的情况。哦,这很可怕。您可能会因为线程太多(如果您使用的是线程服务器,如Puma)和连接池太小而耗尽数据库连接池。请发布你的
数据库.yml
和你的Rails服务器配置。这也会帮助你加载什么页面。C