【问题标题】:Unicorn server mongodb and sinatra独角兽服务器 mongodb 和 sinatra
【发布时间】:2013-02-20 01:58:40
【问题描述】:

所以我一直在尝试了解更多关于这方面的信息。
我目前正在使用 sinatra + mongodb + unicorn 构建轻量级 API。
由于在 unicorn 上运行的中间件应用程序中的实例变量只能在每个请求中存活,这样的事情是行不通的:

@connector ||= Mongo::Connector.new 'localhost'

这意味着对于每个传入的请求,我都会创建一个新的 Mongo::Connection 实例,经过几次请求后,它会在我的机器上生成一整套 mongodb 进程。 我通过声明一个全局变量解决了这个问题

$connector ||= Mongo::Connector.new 'localhost'

但这是要走的路吗?使用这种符号是否安全? 请给我你的想法。

【问题讨论】:

    标签: ruby mongodb sinatra unicorn middleware


    【解决方案1】:

    如果您打算使用全局变量,那么最好使用常量,它在实践中具有相同的范围,但表示您不希望它被重新分配(而且您不希望)。

    比这更好的是类实例变量。范围广,控制严密,意图明显:

    module AmazingProject
      def self.conn
        @conn ||= Mongo::Connector.new 'localhost'
      end
    end
    
    class App < Sinatra::Base
      get "/" do
        AmazingProject.conn.get_all_records # call it from wherever you need it.
      end
    end
    

    在 Sinatra 应用程序的上下文中,我要么使用它,要么将连接放在 settings 帮助器中。

    class App < Sinatra::Base
    
      configure do
        set :conn, { Mongo::Connector.new 'localhost' }
      end
    
      get "/" do
        settings.conn.do_something_interesting()
      end
    end
    

    所有应用程序实例都可以访问settings.conn

    【讨论】:

    • 非常棒!我实际上还没有尝试过,但它是有道理的,实例变量将被视为一个常量,并且会在进一步的请求中继续存在。谢谢
    猜你喜欢
    • 2011-01-27
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2012-01-05
    相关资源
    最近更新 更多