Ruby Rack:启动和拆卸操作(Tokyo Cabinet连接)

我在Sinatra的Rack上构建了一个非常简单的REST服务。 它由3个Tokyo Cabinet / Table数据存储区支持,这些数据存储区具有需要打开和关闭的连接。 我有两个用直接Ruby编写的模型类,目前只是连接,获取或放置他们需要的东西,然后断开连接。 显然,这不会长期发挥作用。

我也有像Warden这样的Rack中间件依赖于这些模型类。

管理打开和关闭连接的最佳方法是什么? 据我所知,Rack不提供启动/关闭挂钩。 我想在env中插入一个提供TC / TT对象引用的中间件,但是我必须通过Sinatra将它传递给模型,这看起来效率也不高; 这只会是TC的每请求连接。 我认为每服务器实例生命周期将是更合适的生命周期。

谢谢!

如果你有其他依赖于这些连接的Rack中间件(通过依赖你的模型类),那么我就不会把连接逻辑放在Sinatra中 – 如果你撕掉Sinatra并放入另一个端点会怎样?

由于您需要按应用程序连接而不是按请求连接,因此您可以轻松编写初始化和清理连接的中间件(将Guard Idiom应用于Rack),并将其安装在需要其他任何其他中间件之前。连接。

class TokyoCabinetConnectionManagerMiddleware class < e puts "Error closing Tokyo Cabinet connection. You might have to clean up manually." end end end end 

如果您以后决定需要每个线程连接或每个请求连接,您可以更改此中间件以将连接置于env Hash ,但您还需要更改模型。 也许这个中间件可以在每个模型类中设置一个connection变量而不是在内部存储它? 在这种情况下,您可能希望在at_exit挂钩中更多地检查连接状态,因为另一个线程/请求可能已关闭它。

您是否考虑过使用Sinatra的configure块来建立连接?

 configure do Connection.initialize_for_development end configure :production do Connection.initialize_for_production end 

在使用像DataMapper和Sinatra这样的东西时,这是一个非常常见的习惯用法

查看http://www.sinatrarb.com/intro上的“配置”部分