在rails控制台中杀死postgre连接

时间:2016-12-07 15:19:30

标签: ruby-on-rails ruby postgresql connection

如何使用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:在`initialize'

2 个答案:

答案 0 :(得分:1)

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

你应该重启Postgres,无论你是从命令行还是从PostgresApp应用程序启动它,它都会清除当前的连接。

作为旁注 - 你不应该超过Postgres在Rails应用程序中提供的连接数。你需要一个很多的并发用户,或者某个地方存在一些真正有问题的循环。

答案 1 :(得分:0)

作为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这样的连接池。