Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 由于Postgres解释语句,Rails应用程序间歇性中断_Ruby On Rails_Ruby_Activerecord_Rails Postgresql - Fatal编程技术网

Ruby on rails 由于Postgres解释语句,Rails应用程序间歇性中断

Ruby on rails 由于Postgres解释语句,Rails应用程序间歇性中断,ruby-on-rails,ruby,activerecord,rails-postgresql,Ruby On Rails,Ruby,Activerecord,Rails Postgresql,Rails 3.2.12应用程序,带有一个外部PG DB,其中包含一个客户表。我有一个本地PG DB,它有一个“地理编码”表。外部客户表可能有也可能没有任何给定客户的纬度和纬度,因此如果客户表没有任何纬度/纬度,我使用本地地理代码表临时填充纬度和纬度 因此,在rails中,我的客户表“有一个”地理代码 发生的情况是,我在选择客户时,会间歇性地让PG解释错误,然后尝试确定他们的lat和long: PG::错误:错误:关系“地理代码”不存在 ~|:解释从“地理编码”中选择“地理编码”。*其中“地理

Rails 3.2.12应用程序,带有一个外部PG DB,其中包含一个客户表。我有一个本地PG DB,它有一个“地理编码”表。外部客户表可能有也可能没有任何给定客户的纬度和纬度,因此如果客户表没有任何纬度/纬度,我使用本地地理代码表临时填充纬度和纬度

因此,在rails中,我的客户表“有一个”地理代码

发生的情况是,我在选择客户时,会间歇性地让PG解释错误,然后尝试确定他们的lat和long:


PG::错误:错误:关系“地理代码”不存在
~|:解释从“地理编码”中选择“地理编码”。*其中“地理编码”。“客户id”=1417限制1
~|在586ms内完成500个内部服务器错误
~|
~| ActiveRecord::StatementInvalid(PG::Error:Error:关系“地理编码”不存在 ~|:解释选择“地理编码”。*从“地理编码”中选择“地理编码”。“客户id”=1417限制1): ~| app/controllers/maps_controller.rb:6:in'all'

这些错误是由PG EXPLAIN语句触发的,这些语句似乎与我设置的限制成半正比。如果客户数量限制为100,我就不会触发解释,因此不会出现错误。如果我把它设置为200,我大约有50%的时间会出错。我所看到的500英镑的上限不可能奏效

当我将限制设置为200时,我有大约50%的机会让应用程序页面工作(这是一个显示客户位置的谷歌地图)。我刷新页面的速度与页面是否正常工作之间似乎存在关联。如果我在一次失败后快速刷新页面,它似乎大部分时间都能正常工作。如果我在超过几秒钟的时间间隔后查看页面,它似乎失败了

有什么办法可以治好吗

我个人的普遍看法是,外部PG DB不知道本地地理编码表,解释是在外部DB上触发的,所以它爆炸了


我对PG的内部工作机制了解不够,无法真正弄清楚如何阻止这些解释语句的发生。

对于那些寻求答案的人来说,答案并不那么迂回,请注意,还可以在适当的环境中设置
config.active\u record.silence\u auto\u explain

Rails将在开发模式下对长时间运行的查询自动运行
explain
。不过,我不知道为什么这会导致错误;看起来该表不存在,但无论运行多长时间,在任何情况下都会导致错误。您是否正在针对尚未迁移的数据库运行此操作?请参阅关于配置的说明。它应该只在开发模式下打开,并且应该仍然执行查询。您可以在
config/environments/development.rb
中关闭explain-in
config.active\u record.auto\u explain\u threshold\u in\u seconds
,将其设置为nilExcellent!将解释阈值设置为零成功了!是的,数据库被迁移了。我认为这是b/c,他们在不同的机器上,非本地数据库只是在一个不存在的表上运行这些解释stmt,整个事情就会爆炸。我不知道PG会在长时间运行的查询上运行explain STMT。我想,当它运行这些语句时的奥秘仍然存在。@user2188073-PG没有。你的Rails应用程序可以。