【问题标题】:Right place for Sequel DB connection while working on Phusion Passenger with nginx在使用 nginx 处理 Phusion Passenger 时,连接 Sequel DB 的正确位置
【发布时间】:2012-02-10 18:36:30
【问题描述】:

我有使用 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: 连接不能被重用 在分叉的过程中。

将数据库连接例程放置到机架文件 config.ru 是否正确,或者最好以不同的方式进行?如果第一个变体比如何从应用程序代码中正确调用连接?

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

【问题讨论】:

  • 为了回答我自己的问题,我在RubyForge 上找到了一些相关信息。我必须将DB.disconnect 放在机架文件config.ru 的最底部。但我仍然在内心深处认为这不是总体正确的方法。任何指导如何解决乘客将如何管理应用程序将不胜感激。
  • Passenger 不提供可以使用的前叉钩子,因此如果您要预加载应用程序,建议在 config.ru 底部调用 DB.disconnect。

标签: ruby nginx sinatra passenger sequel


【解决方案1】:

Phusion 乘客手册的Appendix C.3 中记录了此问题。通常的方法是钩入分叉后回调并在那里重新建立连接。

【讨论】:

    【解决方案2】:

    对不起,我无法在Passenger上检查它,我不知道它是否有效,但在配置块中连接更正确:

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

    例子是Scanty——另一个很棒的 Sinatra + Sequel 应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 2015-01-16
      • 2011-08-17
      • 2019-04-12
      相关资源
      最近更新 更多