【发布时间】:2013-02-07 00:43:16
【问题描述】:
我正在使用 heroku 和 heroku postgresql。如何设置 db 命令超时,以便在 sql 命令耗时超过 10 秒时出现异常?
【问题讨论】:
标签: ruby-on-rails postgresql heroku
我正在使用 heroku 和 heroku postgresql。如何设置 db 命令超时,以便在 sql 命令耗时超过 10 秒时出现异常?
【问题讨论】:
标签: ruby-on-rails postgresql heroku
像这样配置你的 database.yml,关键位是变量哈希:
defaults: &default
adapter: postgresql
encoding: unicode
pool: 5
min_messages: warning
variables:
statement_timeout: 5000
【讨论】:
SET每个会话的其他参数:github.com/rails/rails/blob/4-2-stable/activerecord/lib/…
rails dbconsole 然后 SHOW statement_timeout; 它说我没有任何语句超时。如果这有效,有没有办法验证它是否有效?
rails db 的行为相同。验证它的最简单方法是使用 rails 控制台中的 User.select('pg_sleep(10)') 并验证它是否在 5 秒后超时或您配置的任何内容。
我在这里找到了解决方案:Ruby on Rails: How to set a database timeout in application configuration?
添加
ActiveRecord::Base.connection.execute('set statement_timeout to 10000')
在environment.rb 文件的末尾。
有没有人看到更好的方法?
【讨论】:
我不知道 ruby,但是在 PostgreSQL 中你可以简单地运行这个:
SET statement_timeout = '10s'
之后,此连接(会话)中的所有查询将在运行时受到严格限制。
您也可以在 postgresql.conf 中将其更改为全局默认值,甚至可以在给定数据库或给定用户中将其设为默认值,例如:
ALTER DATABASE web SET statement_timeout = '10s';
ALTER USER bad_user SET statement_timeout = '10s';
【讨论】:
添加
ActiveRecord::Base.connection.execute('set statement_timeout to 10000')
到environment.rb 文件的末尾对我不起作用。
有效的是添加
ActiveRecord::Base.connection.execute("SET statement_timeout = '10s'")
到一个初始化文件。
【讨论】: