使用nginx处理Phusion Passenger时,Sequel DB连接的正确位置

时间:2012-01-15 12:12:37

标签: ruby nginx sinatra passenger sequel

我使用Sinatra + Sequel在ruby上编写测试应用程序。

config.ru:

require './main'

run Sinatra::Application

示例代码:

require 'sinatra'
require 'haml'
require 'sequel'

DB=Sequel.connect('oracle://test:test@test')

class Tarification < Sequel::Model(DB[:test_table]) 

end

get '/' do
  haml :index
end

在我的测试环境中开始使用Phusion Passenger之前,一切都很好。现在我在nginx error.log中有例外:

  

Sequel :: DatabaseError - RuntimeError:无法重用连接   在分叉的过程中。

将数据库连接例程放到rackup文件config.ru是正确的,还是以不同的方式更好?如果第一个变体比如何从应用程序代码调用连接更正?

P.S。:我知道我可以做passenger_spawn_method conservative并继续在应用代码中打开连接,但由于它的速度和资源使用问题,这不是我想要的方式。

2 个答案:

答案 0 :(得分:2)

Phusion Passenger手册的Appendix C.3中记录了此问题。通常的方法是挂钩post-fork回调并在那里重新建立连接。

答案 1 :(得分:1)

抱歉,我无法在Passenger上查看它,我不知道它是否可行,但在配置块中连接更为正确:

configure do
  Sequel.connect(ENV['DATABASE_URL'] || 'sqlite://blog.db')
end

示例是Scanty形式 - 另一个伟大的Sinatra + Sequel应用程序。