所以我一直试图找到更多相关信息 我目前正在使用sinatra + mongodb + unicorn构建一个轻量级的API 由于在独角兽上运行的中间件应用程序中的实例变量只能在每个请求中存活,所以这样的东西不起作用:
@connector ||= Mongo::Connector.new 'localhost'
这意味着对于每个传入的请求,我创建一个新的Mongo :: Connection实例,在一些好请求之后,在我的机器上产生了一大堆mongodb进程。 我通过声明一个全局变量来解决这个问题
$connector ||= Mongo::Connector.new 'localhost'
但这是要走的路吗?使用这种表示法是否安全? 请告诉我你的想法。
答案 0 :(得分: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
。