由于Postgres解释声明,Rails应用程序间歇性地中断

时间:2013-04-01 18:43:19

标签: ruby-on-rails ruby activerecord rails-postgresql

Rails 3.2.12 app,外部PG DB有一个customers表。我有一个本地PG数据库,有一个“地理编码”表。外部客户表可能有也可能没有纬度&任何给定客户的灵活性,所以我使用本地地理编码表临时填充lat&如果客户表没有任何纬度/经度,则为多。

所以,在rails中,我的客户表“has_one”地理编码。

正在发生的事情是,当我选择客户时,我会间歇性地收到PG Explain错误,然后尝试确定他们的lat&长:

PG::Error: ERROR: relation "geocodes" does not exist ~ |: EXPLAIN SELECT "geocodes".* FROM "geocodes" WHERE "geocodes"."customer_id" = 1417 LIMIT 1 ~ |Completed 500 Internal Server Error in 586ms ~ |
~ |ActiveRecord::StatementInvalid (PG::Error: ERROR: relation "geocodes" does not exist ~ |: EXPLAIN SELECT "geocodes".* FROM "geocodes" WHERE "geocodes"."customer_id" = 1417 LIMIT 1): ~ | app/controllers/maps_controller.rb:6:in `all'

这些错误是由PG EXPLAIN语句触发的,这些语句似乎与我设置的LIMIT半成正比。如果客户的LIMIT为100,我从未触发EXPLAIN,因此没有错误。如果我将其设置为200,我会在50%的时间内收到错误。 500的限制没有我见过的工作机会。

当我设置LIMIT为200时,我有大约50%的机会使应用页面正常工作(这是显示客户位置的谷歌地图)。 似乎是我刷新页面的速度和相关性之间的相互关系。它是否会奏效。例如:如果我在失败后快速刷新页面,似乎它在很高的时间内工作。如果我在大于几秒的间隔后查看页面,它似乎失败了。

关于如何解决这个问题的任何想法?

我自己普遍认为外部PG数据库不知道本地地理编码表,并且在外部数据库上触发了EXPLAIN,因此它会爆炸。

我对PG的内部工作方式知之甚少,无法真正弄清楚如何阻止这些EXPLAIN语句的发生。

1 个答案:

答案 0 :(得分:0)

对于那些寻求不那么迂回的答案的人,请注意,也可以在适当的环境中设置config.active_record.silence_auto_explain