如何在Rails中设置PostgreSQL命令超时时间

18

我正在使用Heroku和Heroku PostgreSQL。如何设置数据库命令超时,使得当一个SQL命令执行时间超过10秒时抛出异常?

4个回答

22

将您的 database.yml 配置成这样,关键是要注意变量哈希:

defaults: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  min_messages: warning
  variables:
    statement_timeout: 5000

您也可以在每个会话中设置其他参数:https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L65-L66 - theandym
如果我运行 rails dbconsole 然后输入 SHOW statement_timeout; 它会显示我没有任何语句超时。如果这个有效,有没有一种方法来验证它是否有效? - Schneems
我在使用 rails db 时看到了相同的行为。最简单的验证方法是在 Rails 控制台中执行类似于 User.select('pg_sleep(10)') 的语句,并验证它是否在5秒钟或您配置的时间后超时。 - Bill Lipa
有没有办法只将此添加到前端而不是后台工作者(Sidekiq)? - collimarco
当然可以。database.yml文件可以包含ERB(Ruby逻辑),因此您可以执行类似于传递命令行标志或为该进程类型设置环境变量的操作,然后在超时配置上执行if语句。 - Bill Lipa

6

此命令通过ActiveRecord连接运行来自其他答案的SQL命令,以便在连接持续时间内保持其真实性。它应该是有效的。 - GregB
这个在Heroku上能行吗?即Heroku会在30秒后切断你的工作连接? - Ace Dimasuhid

5

我不懂ruby语言,但在PostgreSQL中你可以直接运行以下命令:

SET statement_timeout = '10s'

之后,此连接(会话)中的所有查询都将在运行时有严格的限制。

您还可以在postgresql.conf中更改它作为全局默认值,甚至可以像以下方式为给定数据库或给定用户设置默认值:

ALTER DATABASE web SET statement_timeout = '10s';
ALTER USER bad_user SET statement_timeout = '10s';

5

添加

ActiveRecord::Base.connection.execute('set statement_timeout to 10000')

在我的情况下,在environment.rb文件的末尾添加并没有起作用。
有效的方法是添加:
ActiveRecord::Base.connection.execute("SET statement_timeout = '10s'")

转到一个初始化文件。


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