의 "구성"섹션 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
후크에서 연결 상태에 대해 더 많은 검사를하고 싶을 수 있습니다. 다른 스레드/요청이이를 닫을 수 있기 때문입니다.
굉장합니다. 감사! –