我正在使用Heroku和Heroku PostgreSQL。如何设置数据库命令超时,使得当一个SQL命令执行时间超过10秒时抛出异常?
我正在使用Heroku和Heroku PostgreSQL。如何设置数据库命令超时,使得当一个SQL命令执行时间超过10秒时抛出异常?
将您的 database.yml 配置成这样,关键是要注意变量哈希:
defaults: &default
adapter: postgresql
encoding: unicode
pool: 5
min_messages: warning
variables:
statement_timeout: 5000
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'")
转到一个初始化文件。
rails dbconsole
然后输入SHOW statement_timeout;
它会显示我没有任何语句超时。如果这个有效,有没有一种方法来验证它是否有效? - Schneemsrails db
时看到了相同的行为。最简单的验证方法是在 Rails 控制台中执行类似于User.select('pg_sleep(10)')
的语句,并验证它是否在5秒钟或您配置的时间后超时。 - Bill Lipa