4

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

配置.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 是否正确,或者最好以不同的方式进行?如果第一个变体比如何从应用程序代码正确调用连接?

PS:我知道我可以passenger_spawn_method conservative在应用程序代码中继续打开连接,但这不是我正在寻找的方式,因为它的速度和资源使用问题。

4

2 回答 2

2

这个问题记录在Phusion 乘客手册的附录 C.3中。通常的方法是挂钩后叉回调并在那里重新建立连接。

于 2012-03-11T22:19:14.213 回答
1

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

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

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

于 2012-03-11T22:14:31.060 回答