2014-10-02 3 views
2

Sinatra 및 PostgreSQL에서 ActiveRecord를 사용하고 있습니다. 일시적인 네트워크 오류 또는 postgres 서버 재시작으로 인해 데이터베이스 연결이 끊어지면 내 앱이 자동으로 연결을 다시 얻지 않습니다. postgres에 다시 연결하려면 앱을 다시 시작해야합니다. 나는 다른 프로젝트에서 Rails를 사용할 때이 문제가 없었던 것을 기억합니다.ActiveRecord : 연결이 끊어 질 때 자동으로 PostgreSQL에 다시 연결하는 방법은 무엇입니까?

자동으로 PostgreSQL에 다시 연결하도록 ActiveRecord에 알리기 위해 몇 가지 구성이나 코드를 넣어야합니까?

답변

0

당신이 레일 외부 액티브 레코드 또는 데이터베이스 문을 실행하기 전에 자신의 연결을 확인해야 적어도 외부 컨트롤러 액션을 사용하는 경우 https://www.new-bamboo.co.uk/blog/2010/04/11/automatic-reconnection-of-mysql-connections-in-active-record/에서. 이것은 다음과 같은 코드로 수행 할 수 있습니다 : 액티브 레코드 이후

ActiveRecord::Base.verify_active_connections! 

이 검증 별도로 각 스레드에 대해 실행해야하는 멀티 스레드 애플리케이션에서, 스레드 당 하나 개의 연결을 사용합니다.

블로그 게시물은 MySQL에 다시 연결하는 것에 관한 것이지만 사용 된 엔진에 관계없이 동일한 것으로 간주됩니다. 이는 추상화 된 것입니다. 이 블로그는 구성에서 다시 연결 옵션을 언급하지만 Postgres에서 작동하는지 알아야합니다.

+0

동일한 증상이 있습니다. 그러나'ActiveRecord :: Base.verify_active_connections! '는 레일즈 커밋 9d1f1b1e와 함께 사라졌습니다. – ruseel

1

ActiveRecord::Base.verify_active_connections!은 2012 년 레일 커밋 9d1f1b1ea9e5d637984fda4f276db77ffd1dbdcb에서 제거되었습니다. 그래서 우리는 그 방법을 사용할 수 없습니다.

아래의 문장은 짧은 조사 결과입니다. 나는 레일 activerecord의 전문가가 아니다. 그래서 신중하게 들어라.

comment in connection_pool.rb

그래서 어쩌면 당신 (그리고 I. 난 그냥 당신처럼 같은 상황이)가 풀에 연결을 반환해야
# 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로시나에서 풀에 연결을 반환, 우리는 항상 checkout_and_verify, this line 같이 a different way을 사용하는 9d1f1b1ea9e5d637984fda4f276db77ffd1dbdcb을 커밋 액티브 :: ConnectionAdapters :: ConnectionManagement

다음
use ActiveRecord::ConnectionAdapters::ConnectionManagement 

및 사용 액션 팩 라이프 사이클을 준수함으로써 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

관련 문제