3

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

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

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

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

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

4

1 回答 1

2

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

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

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.

于 2013-03-06T03:03:33.113 回答