2012-01-15 3 views
4

私はSinatra + Sequelを使ってRuby上でテストアプリケーションを書いています。nginxでPhusion Passengerで作業中のSequel DB接続のための適切な場所

config.ru:

require './main' 

run Sinatra::Application 

例コード:

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

DB=Sequel.connect('oracle://test:[email protected]') 

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

end 

get '/' do 
    haml :index 
end 

私は私のテスト環境でのPhusion旅客を使用して起動するまで、すべてが大丈夫でした。今、私はnginxののerror.logファイルに例外を持っている:

Sequel::DatabaseError - RuntimeError: The connection cannot be reused in the forked process.

は、ファイルconfig.ruをrackupするDB接続ルーチンを置くには正しいことですか、それは別の方法でそれを行う方が良いでしょうか?アプリケーションコードから正しい接続を呼び出す方法よりも最初の変種ですか?

P .:私はpassenger_spawn_method conservativeを実行してアプリケーションコードで接続を開くことができますが、スピードとリソースの使用上の問題から探している方法ではありません。

+0

私自身の質問に答えるために、私は[RubyForge](http://rubyforge.org/forum/message.php?msg_id=63321)に関する少しの関連情報を見つけました。 ラックアップファイル 'config.ru'の一番下に' DB.disconnect'を置く必要がありました。 しかし、私はまだ全体的に正しいアプローチではないと私は考えています。乗客がどのようにアプリケーションを管理するかを整理するための方向性は高く評価されます。 –

+1

乗客は使用できるフォークフックを提供していないので、アプリを事前にロードする場合は、config.ruの一番下にあるDB.disconnectを呼び出すことをお勧めします。 –

答えて

2

この問題は、Phusion PassengerマニュアルのAppendix C.3に記載されています。通常の方法は、ポストフォークコールバックにフックしてそこの接続を再確立することです。

1

は申し訳ありませんが、私は助手席でそれをチェックする機能を持っていないと私はそれが動作するかわからないが、configureブロックに接続するために、より正確である:

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

例は、フォームScantyです - もう一つの素晴らしいSinatra + Sequelアプリケーションです。