首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby Rack:启动和拆卸操作(东京机柜连接)

Ruby Rack:启动和拆卸操作(东京机柜连接)
EN

Stack Overflow用户
提问于 2010-04-06 13:28:54
回答 2查看 2K关注 0票数 3

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

我也有一些依赖于这些模型类的Rack中间件,比如Warden。

管理打开和关闭连接的最佳方式是什么?据我所知,Rack并没有提供启动/关闭钩子。我考虑过在env中插入一个中间件来提供对TC/TT对象的引用,但随后我必须通过Sinatra将其通过管道传递到模型,这似乎也不是很有效;而且这只能得到到TC的每个请求的连接。我认为每个服务器实例的生命周期应该是一个更合适的生命周期。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-06 22:20:53

如果您有其他依赖于这些连接的Rack中间件(通过依赖于您的模型类),那么我不会将连接逻辑放在Sinatra中--如果去掉Sinatra并放入另一个端点,会发生什么?

由于您希望按应用程序连接而不是按请求连接,因此可以很容易地编写一个初始化和清理连接的中间件(类似于应用于Rack的Guard惯用法),并将其安装在需要连接的任何其他中间件之前。

代码语言:javascript
复制
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钩子中的连接状态进行更多的检查,因为另一个线程/请求可能已经关闭了它。

票数 2
EN

Stack Overflow用户

发布于 2010-04-06 22:00:31

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

代码语言:javascript
复制
configure do
  Connection.initialize_for_development
end

configure :production do
  Connection.initialize_for_production
end

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2582822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档