2014-10-02 2 views
2

Я использую ActiveRecord с Sinatra и PostgreSQL. Когда соединение с базой данных падает (из-за временного сбоя сети или перезапуска сервера postgres), мое приложение не восстанавливает соединение автоматически. Я должен перезапустить приложение, чтобы снова подключиться к postgres. Я помню, что у меня не было этой проблемы, когда я использовал Rails в другом проекте.ActiveRecord: как подключиться к PostgreSQL автоматически при отключении соединения?

Должен ли я указать какую-либо конфигурацию или код, чтобы сообщить ActiveRecord для автоматического подключения к PostgreSQL?

ответ

0

От https://www.new-bamboo.co.uk/blog/2010/04/11/automatic-reconnection-of-mysql-connections-in-active-record/

Если вы используете Active Record вне Rails или, по крайней мере, за пределами действия контроллера вы должны проверить соединения по своему усмотрению перед выполнением заявление базы данных. Это можно сделать с помощью следующего кода:

ActiveRecord::Base.verify_active_connections! 

Поскольку Active Record использует одно соединение для каждого потока, в многопоточных приложениях эта проверка должна быть выполнена для каждого потока отдельно.

Сообщение в блоге о переподключении к MySQL, но я предполагаю, что это будет одинаково независимо от используемого движка, поскольку он абстрагируется. В блоге также упоминается опция повторного подключения в конфигурации, но вам нужно будет выяснить, работает ли это для Postgres.

+0

У меня точно такой же симптом. Но 'ActiveRecord :: Base.verify_active_connections!' Ушел с rails commit 9d1f1b1e. – ruseel

1

ActiveRecord::Base.verify_active_connections! удален в 2012 году в рельсах совершить 9d1f1b1ea9e5d637984fda4f276db77ffd1dbdcb. поэтому мы не можем использовать этот метод.

Приведенные ниже предложения являются результатом моего короткого расследования. Я не являюсь экспертом в рельсах activerecord. поэтому слушайте с осторожностью. (Но надеюсь, что это полезно)

comment in connection_pool.rb сказал

# 1. Simply use ActiveRecord::Base.connection as with Active Record 2.1 and 
    # earlier (pre-connection-pooling). Eventually, when you're done with 
    # the connection(s) and wish it to be returned to the pool, you call 
    # ActiveRecord::Base.clear_active_connections!. This will be the 
    # default behavior for Active Record when used in conjunction with 
    # Action Pack's request handling cycle. 

так, может быть, вы (и я у меня такая же ситуация, как и вы) должны вернуть подключение к бассейну.

и вернуть связи для объединения в Синатрой в Action Pack's request handling cycle, используйте ActiveRecord :: ConnectionAdapters :: ConnectionManagement

use ActiveRecord::ConnectionAdapters::ConnectionManagement 

, а затем, как указано в рельсах совершают 9d1f1b1ea9e5d637984fda4f276db77ffd1dbdcb мы используем a different way как в this line, всегда checkout_and_verify при использовании Basae.connection, соблюдая жизненный цикл пакета действий.

def connection 
    # this is correctly done double-checked locking 
    # (ThreadSafe::Cache's lookups have volatile semantics) 
    @reserved_connections[current_connection_id] || synchronize do 
     @reserved_connections[current_connection_id] ||= checkout 
    end 
    end 
+0

Действительно хороший ответ, рад, что вы разобрались! – iain