2011-07-09 18 views
1

の下で生産して実行されません! Mongrelを使用するとOKです。後で呼び出される関数の中にコードを入れて、Passenger +の開発設定も機能します。SQLは、私は次のようなコードを持っているのPhusion旅客

旅客が私が気付いていない接続またはクラスのインスタレーションを扱う方法には何かがありますか?

編集:

旅客が接続する方法は明らかです。だから、質問は "は、接続が確立されたときにSQL文を実行する方法をサポートしていますか?"

+1

ActiveRecordの不可知論を無視するので、本当に生のSQLを呼び出すべきではありません。 – henrikhodne

+0

この場合を除き、明らかにデータベース固有のコマンドです。 IIRCには接続オブジェクトを介して何らかの方法がありますが、文書化されていないAR内部の束を掘り起こす必要があります。 – wonnage

+0

私はこれがクラスキャッシングだと信じています。 'config/environments/production.rb'で' config.cache_classes = false'のようにオフにしてみてください。しかし、これはとにかくプロダクションではお勧めできません。 – taro

答えて

0

お客様のエラーログを確認してください。これは、標準のレールログファイルと異なる場合があります。

1

私の精神的なデバッグは、あなたが乗客のフォークモデルに噛まれていると言います。

基本的に、Passengerは、あなたのレール環境が既にロードされているメインプロセスからワーカープロセスを一括してフォークします。これにより、モデル、コントローラなどのクラスがすべて既に存在するため、ワーカーの初期化にかかる時間が短縮されます。

さて、旅客のドキュメントから:あなたは、通常、任意のデータベース が発生しない理由のPhusion旅客 は、自動的に新しいワーカープロセスを作成 時にデータベースへ 接続を再確立

。なお、これ ですスマート スポーンモードを使用しているときに問題が発生します。

あなたのconnection.execute文は、TheClassがロードされたときに実行されます。これは実際には、すべての作業者をフォークする親プロセスで一度だけ発生します。ワーカーはそれぞれ独自の接続を確立しますが、TheClassが既にロードされているので、決してあなたの「言語設定」クエリを実行することはありません。毎回あなたのクラスをリロードするので、devモードで動作します。

ActiveRecordに接続言語を教えるためにapplication.rbで行うことができる設定があるかもしれません。そうしないと、おそらくbefore_filterなどでそのクエリを実行するという面倒な作業が必要になるでしょう。

+1

正しい方法は、 'after_connection'のようにActiveRecordのコールバックでなければなりません。あるいは、アダプタはdatabase.ymlプロパティでそれを設定します。 –

関連する問題