2010-04-06 2 views
3

저는 Rin의 Sinatra에서 매우 간단한 REST 서비스를 구축했습니다. 3 개의 Tokyo Cabinet/Table 데이터 저장소가 뒷받침됩니다.이 데이터 저장소는 연결을 열고 닫아야합니다. Ruby로 작성된 두 개의 모델 클래스가 있습니다. 현재 루비는 단순히 연결하거나, 필요한 것을 얻거나 넣은 다음 연결을 끊습니다. 분명히, 이것은 장기적으로 작용하지 않을 것입니다.Ruby Rack : 시동 및 분해 작업 (도쿄 캐비닛 연결)

또한이 모델 클래스에 의존하는 Warden과 같은 일부 랙 미들웨어가 있습니다.

연결 열기 및 닫기를 관리하는 가장 좋은 방법은 무엇입니까? 랙은 내가 알고있는 것처럼 시작/종료 후크를 제공하지 않습니다. env에서 TC/TT 객체에 대한 참조를 제공하는 미들웨어 조각을 삽입하는 방법에 대해 생각했지만 Sinatra를 통해 모델에 파이프를 연결해야했습니다. TC에 대한 요청 별 연결 일뿐입니다. 나는 서버 - 인스턴스 - 라이프 사이클이 더 적절한 수명이라고 생각한다.

감사합니다.

답변

2

의 "구성"섹션 DataMapper 등을 사용하는 동안 꽤 일반적인 관용구의

configure do 
    Connection.initialize_for_development 
end 

configure :production do 
    Connection.initialize_for_production 
end 

당신의 모델 클래스에 대한 의존성), Sinatra에 연결 논리를 두지는 않을 것입니다. Sinatra를 찢어 다른 끝점에 넣으면 어떻게 될까요?

은 요청 당 연결보다 응용 프로그램 연결을 원하기 때문에 연결을 초기화하고 정리 한 미들웨어를 쉽게 작성할 수 있습니다 (랙에 적용된 Guard Idiom의 종류). 연결이 필요한 다른 미들웨어. 당신이 나중에 연결 당 스레드 또는 연결 당 요청을하고자 결정하는 경우

class TokyoCabinetConnectionManagerMiddleware 
    class <<self 
    attr_accessor :connection 
    end 

    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    open_connection_if_necessary! 
    @app.call(env) 
    end 

    protected 

    def open_connection_if_necessary! 
    self.class.connection ||= begin 
     ... initialize the connection .. 
     add_finalizer_hook! 
    end 
    end 

    def add_finalizer_hook! 
    at_exit do 
     begin 
     TokyoCabinetConnectionManagerMiddleware.connection.close! 
     rescue WhateverTokyoCabinetCanRaise => e 
     puts "Error closing Tokyo Cabinet connection. You might have to clean up manually." 
     end 
    end 
    end 
end 

, 당신은 env Hash에서 연결을 넣어이 미들웨어를 변경할 수 있지만, 당신은뿐만 아니라 모델을 변경해야합니다. 아마도이 미들웨어는 내부적으로 저장하는 대신 각 모델 클래스에 connection 변수를 설정할 수 있습니까? 이 경우 at_exit 후크에서 연결 상태에 대해 더 많은 검사를하고 싶을 수 있습니다. 다른 스레드/요청이이를 닫을 수 있기 때문입니다.

+0

굉장합니다. 감사! –

3

Sinatra의 configure 블록을 사용하여 연결을 설정해 보셨습니까? 시나

체크 아웃 당신이 방법으로 (이 연결에 의존하는 다른 랙 미들웨어가있는 경우 http://www.sinatrarb.com/intro

+0

상금을 받으십시오. 이것은 작동 한 몇 가지 게시물 중에서 유일한 답입니다! –