Если у вас есть другое промежуточное программное обеспечение Rack, которое зависит от этих подключений (в зависимости от классов вашей модели), то я бы не стал вводить логику подключения в Sinatra - что произойдет, если вы удалите Sinatra и вставите другое конечная точка?
Поскольку вы хотите подключение-на-приложение, а не-подключение-на-запрос, вы можете легко написать промежуточное программное обеспечение, которое инициализирует и очищает подключения (своего рода Guard Idiom применительно к Rack) и установить это впереди любого другого промежуточного программного обеспечения, которому нужны соединения.
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
, поскольку другой поток / запрос мог его закрыть.