【问题标题】:Kill postgre connection in rails console在 Rails 控制台中终止 postgres 连接
【发布时间】:2017-04-22 14:44:23
【问题描述】:

如何使用 rails 控制台终止所有 postgre 连接?我得到了这个:

PG::ConnectionBad
FATAL: sorry, too many clients already FATAL: sorry, too many clients already

Rails.root: C:/Users/IBM_ADMIN/Desktop/Work/Extreme Blue Summer Internship/extreme-blue

Application Trace | Framework Trace | Full Trace
activerecord (4.2.7.1) lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `initialize'
activerecord (4.2.7.1) lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `new'
activerecord (4.2.7.1) lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `connect'
activerecord (4.2.7.1) lib/active_record/connection_adapters/pos

问题是我不想删除数据库,而只是杀死所有与它的连接?任何帮助将不胜感激!

tgresql_adapter.rb:242:in `initialize'

【问题讨论】:

标签: ruby-on-rails ruby postgresql connection


【解决方案1】:

您不能使用rails console 杀死 Postgres 进程。

您应该重新启动 Postgres,但是您启动它(从命令行或例如从 PostgresApp 应用程序),它将清除当前连接。

附带说明 - 您不应超过 Postgres 可以在 Rails 应用程序中提供的连接数。您要么需要很多个并发用户,要么在某个地方需要一些真正有问题的循环。

【讨论】:

    【解决方案2】:

    作为 PostgreSQL 超级用户,您可以使用函数 pg_terminate_backend 来终止会话。您可以从 pg_stat_activity 视图中获取后端进程 ID 列表。

    所以查询可能如下所示:

    SELECT pg_terminate_backend(pid)
    FROM pg_stat_activity
    WHERE pid <> pg_backend_pid();
    

    为了减少干扰,您可以添加AND state = 'idle'

    确保您的应用程序没有以超级用户身份连接,那么总会有superuser_reserved_connections(默认 3 个)可供超级用户使用的连接。

    话虽如此,您的应用程序实际上不应超过最大连接数。如果不能保证,请使用 pgBouncer 之类的连接池。

    【讨论】:

    • 感谢@Laurenz 的回答。 rails 会自动关闭连接,因为我不记得写过任何应该让我激活连接的循环
    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多