2016-12-07 4 views
0

Как я могу убить все postgre-соединения с помощью консоли rails? Я получаю это:Убить соединение postgre в консоли rails

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: в `инициализации»

+0

Есть ли где-нибудь в вашем коде, где вы устанавливаете соединения? Возможно, связи остаются открытыми постоянно? – mokayode

+0

http://stackoverflow.com/questions/2757549/org-postgresql-util-psqlexception-fatal-sorry-too-many-clients-already – mokayode

ответ

0

Как суперпользователя PostgreSQL, вы можете использовать функцию pg_terminate_backend убить сессию. Вы можете получить список идентификаторов процесса доступа из окна pg_stat_activity.

Так, запрос может выглядеть следующим образом:

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

Чтобы быть менее разрушительным, вы можете добавить AND state = 'idle'.

Убедитесь, что ваше приложение не подключается как суперпользователь, тогда всегда будет superuser_reserved_connections (по умолчанию 3) соединения, которые могут использоваться суперпользователем.

Все, что сказано, ваше приложение не должно превышать максимальное количество соединений. Если вы не можете этого гарантировать, используйте пул соединений, например pgBouncer.

+0

Спасибо @Laurenz за ваш ответ. Является ли рельсы автоматически закрытием соединений, поскольку я не помню, чтобы написали какие-либо петли, которые должны позволить мне активные соединения –

0

Вы не можете использовать rails console для уничтожения процессов Postgres.

Необходимо перезапустить Postgres, но вы запустили его (либо из командной строки или, например, из приложения PostgresApp), и очистите текущие соединения.

В качестве побочного примечания - вы не должны превышать количество подключений. Postgres может предлагать внутри приложения Rails. Вам потребуется либо лот одновременных пользователей, либо какой-то действительно проблемный цикл где-то.