如何在Sinatra中为mongodb创建全局连接对象?

时间:2010-11-21 05:44:03

标签: ruby mongodb sinatra

使用ruby mongodb驱动程序,有没有办法在configure块中创建一个可以在路由方法中访问的连接对象,这样我就不必在每个请求上重新创建连接了?

1 个答案:

答案 0 :(得分:6)

在配置块中设置全局变量:

configure do
  $mongo = Mongo::Connection.new
end

或将其贴在settings

configure do
  set :mongo, Mongo::Connection.new
end

get '/' do
  # the connection is available through settings.mongo
end

我必须说,我发现这些都不是很优雅。

开发时可能看起来好像是在每个请求上创建连接,但是在生产中启动服务器,您会发现它的行为有所不同(例如,thin -e production)。

此外,如果您的应用程序将在Passenger下运行,则需要执行此操作:

 configure do
   if defined?(PhusionPassenger)
     PhusionPassenger.on_event(:starting_worker_process) do |forked|
       if forked
         # *** reconnect to the database here! ***
       end
     end
   end
 end

它的作用是它在Passenger forks之后重新连接到数据库,因此子进程有自己的连接。不这样做会给你带来非常奇怪的错误。