我使用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
并继续在应用代码中打开连接,但由于它的速度和资源使用问题,这不是我想要的方式。
答案 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应用程序。