「配置」一節。如果你有依賴於這些連接(通過方式等Rack中間件退房是一個相當常見的成語依賴於你的模型類),那麼我不會把連接邏輯放在Sinatra中 - 如果你翻譯Sinatra並放入另一個端點會發生什麼?
既然你要連接的每個應用程序,而不是連接的每個請求,你可以很容易地編寫初始化和清理連接(排序衛隊成語適用於機架)的中間件,並且提前安裝任何其他需要連接的中間件。
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
鉤子中的連接狀態,因爲另一個線程/請求可能已關閉它。
太棒了。謝謝! – 2010-04-06 19:55:09