PG::UnableToSend:Rails中没有与服务器的连接

8

我有一台正在运行ubuntu 14.04Rails 4.2.0postgresql 9.6.1和gempg 0.21.0/0.20.0的生产服务器。在过去几天中,访问psql服务器中的customer_input_datax_records表时经常出现错误。

D, [2017-07-20T18:08:39.166897 #1244] DEBUG -- :   CustomerInputDatax::Record Load (0.1ms)  SELECT "customer_input_datax_records".* FROM "customer_input_datax_records" WHERE ("customer_input_datax_records"."status" != $1)  [["status", "email_sent"]]
E, [2017-07-20T18:08:39.166990 #1244] ERROR -- : PG::UnableToSend: no connection to the server
: SELECT "customer_input_datax_records".* FROM "customer_input_datax_records" WHERE ("customer_input_datax_records"."status" != $1)

调用访问数据库服务器的代码是使用Rufus scheduler 3.4.2循环的:

s = Rufus::Scheduler.singleton
s.every '2m' do

    new_signups = CustomerInputDatax::Record.where.not(:status => 'email_sent').all

.......
end

重新启动服务器后,通常会出现第一次请求(或几次请求)出现问题。但是在一段时间后(例如1或2小时),问题开始出现。但是应用程序似乎运行良好(读/写访问记录和创建新记录)。有一些在线帖子介绍了这个错误。然而,问题似乎不是我遇到的那种。在重新安装psql服务器之前,我想先了解一下是什么导致了“无连接”的问题。

更新:database.yml

production:
  adapter: postgresql
  encoding: unicode
  host: localhost
  database: wb_production
  pool: 5
  username: postgres
  password: xxxxxxx

你在开发或生产中遇到了这个问题吗? 你的本地数据库连接是否可信? - mabe02
该应用程序是否部署在 AWS 服务上? - mabe02
可能与您正在使用的一些 gem 有关吗?我在 delayed_jobparallel 等上看到了一些问题... - mabe02
它在阿里云上。错误是由一行代码引起的。刚刚更新了帖子。new_signups = CustomerInputDatax::Record.where.not(:status => 'email_sent').all - user938363
1
rufus_scheduler 从 3.4.2 降级到 3.3.4,系统开始正常访问表格。看起来与更新的 rufus_scheduler 版本有关。将尝试使用 whenever。谢谢。 - user938363
显示剩余3条评论
2个回答

4

因此,错误信息是“RAILS: PG :: UnableToSend:无法连接到服务器”。

这让我想起了{{link1:rufus-scheduler中ActiveRecord对象的连接池问题}}。

您可以执行以下操作

s = Rufus::Scheduler.singleton
s.every '2m' do

  ActiveRecord::Base.connection_pool.with_connection do
    new_signups = CustomerInputDatax::Record
      .where.not(status: 'email_sent')
      .all
    # ...
  end
end

挖掘

了解问题的更多细节会很有帮助。

我建议尝试这段代码:

s = Rufus::Scheduler.singleton

def s.on_error(job, error)

  Rails.logger.error(
    "err#{error.object_id} rufus-scheduler intercepted #{error.inspect}" +
    " in job #{job.inspect}")
  error.backtrace.each_with_index do |line, i|
    Rails.logger.error(
      "err#{error.object_id} #{i}: #{line}")
  end
end

s.every '2m' do
  new_signups = CustomerInputDatax::Record.where.not(:status => 'email_sent').all
  # .......
end

一旦问题出现,我会在Rails日志中寻找on_error的完整输出。
这个on_error来自于https://github.com/jmettraux/rufus-scheduler#rufusscheduleron_errorjob-error

1
正如我们在评论中讨论的那样,问题似乎与您的rufus版本有关。我建议您查看whenever gem,并调用rake任务而不是直接调用activerecord模型。
然而,最好在github上的rufus-scheduler存储库中打开一个带有错误回溯的问题(只是为了让他们知道...)

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