Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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 如何在rails中设置postgresql命令超时_Ruby On Rails_Postgresql_Heroku - Fatal编程技术网

Ruby on rails 如何在rails中设置postgresql命令超时

Ruby on rails 如何在rails中设置postgresql命令超时,ruby-on-rails,postgresql,heroku,Ruby On Rails,Postgresql,Heroku,我正在使用heroku和heroku postgresql。如何设置db命令超时,以便在sql命令耗时超过10秒时出现异常?我不知道ruby,但在PostgreSQL中,您可以简单地运行以下命令: SET statement_timeout = '10s' 之后,此连接(会话)中的所有查询都将对运行时进行严格限制 您还可以在postgresql.conf中将其更改为全局默认值,甚至在给定数据库或给定用户中设置为默认值,如: ALTER DATABASE web SET statement_ti

我正在使用heroku和heroku postgresql。如何设置db命令超时,以便在sql命令耗时超过10秒时出现异常?

我不知道ruby,但在PostgreSQL中,您可以简单地运行以下命令:

SET statement_timeout = '10s'
之后,此连接(会话)中的所有查询都将对运行时进行严格限制

您还可以在postgresql.conf中将其更改为全局默认值,甚至在给定数据库或给定用户中设置为默认值,如:

ALTER DATABASE web SET statement_timeout = '10s';
ALTER USER bad_user SET statement_timeout = '10s';
我在这里找到了一个解决方案:

environment.rb
文件的末尾


有人认为有更好的方法吗?

像这样配置您的database.yml,关键位是变量哈希:

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

environment.rb
文件的末尾,该文件对我不起作用

起作用的是增加

ActiveRecord::Base.connection.execute("SET statement_timeout = '10s'")

初始化文件。

此命令通过ActiveRecord连接从另一个应答运行SQL命令,以便在连接期间保持该状态。这应该是有效的。这在heroku行得通吗?i、 e heroku在30秒后切断您的工作连接?您还可以
设置每个会话的其他参数:如果我运行
rails dbconsole
,然后
SHOW statement\u timeout它说我没有任何语句超时。如果这样做有效,有没有办法验证它是否有效?我在
railsdb
中看到了相同的行为。验证它的最简单方法是类似于
User。从rails控制台中选择('pg_sleep(10)
),并验证它是否在5秒后超时,或者您将其配置为什么。是否有任何方法仅将其添加到前端,而不添加到后台工作人员(Sidekiq)?确定。yml可以包含ERB(ruby logic),因此您可以传递命令行标志或为该进程类型设置环境变量,然后在超时配置上执行if。
ActiveRecord::Base.connection.execute('set statement_timeout to 10000')
ActiveRecord::Base.connection.execute("SET statement_timeout = '10s'")