2010-11-30 17 views
2

私は、データベース接続がなくなると、私のレールアプリでコントローラの特定のページを表示しようとしています。私はrescue_actionメソッドでMysql :: Errorをキャッチし、適切なページをレンダリングすることでこれを行います。 mysqlサービスが単独で停止しているとき、私はMysql :: Error例外を実際にすぐに取得し、遅延なくページをレンダリングできます。Railsがバックグラウンドでデータベース接続を処理する方法は?

しかし、サーバー自体がシャットダウンされると、レールはMysql :: Errorをスローするのに3分かかり、5-6リクエスト後にウェブサイト全体が応答しなくなります。

私は、どのような方法でrailsフレームワークで、mysqlサーバがシャットダウンされるような長い時間がかかるかを考えました。これは、メソッドconnection.real_connect(アクティブレコードmysql_adapterファイル内)で、例外を返して3分かかりました。

私はsystemTimer gemを使ってこのメソッドをタイムアウトすることに決めました。このサルのパッチは、データベース接続でWebサイトを起動し、すぐにデータベースサーバーをシャットダウンしたときに完全に機能しました。

しかし、私はデータベースでウェブサイトを起動し、いつかウェブサイトにアクセスしてデータベースサーバをシャットダウンすると、まったく動作しません。以前と同じようにウェブサイト全体が反応しなくなります。私は2つのシナリオの違いは何ですか?

私は、レールがデータベース接続をどのように扱うかについてもっと詳しく知っておく必要があると思います。データベース接続が切断されたときの反応私はサルのパッチを置くことができ、私のspefic要件のために働くことができる正確な場所を特定することができました。私はこれを説明する関連記事を見ていません。

すべてのヘルプは、私はこれを試していませんでしたが、あなたは指定されたオプションの1つとしてconnect_timeoutを追加することができます(ETCポート、ホスト、と一緒に)のために

おかげで、

答えて

4

私にとって非常に有用であろうdatabase.ymlファイルのMySQL接続。その値はreal_connect呼び出しに渡され、MySQLへの接続が確立されます。

さらに、初期接続が完了してDBがシャットダウンしてから遅延が発生するため、read_timeout設定オプションを使用する必要があります。

+0

私のdatabase.ymlファイルにタイムアウトを設定するには、このパッチをhttps://github.com/rails/rails/commit/d3a802cee0f8cbe209af8886f8f8e8cab204d21aに置く必要があると思います。私は以前のバージョンのレールを使用しています( – anusuya

+1

)私が見ていた追加の設定オプションがレールにあることを指定しているはずです3 –

+0

私はこのパッチを追加しました(https://github.com/rails/rails/commit/d3a802cee0f8cbe209af8886f8f8e8cab204d21a )私のレールの中に。 read_timeoutとwrite_timeoutをdatabase.ymlファイルに設定します。書き込みタイムアウトは私が推測するように動作しているようです(ウェブサイトを起動した直後にデータベースサーバをシャットダウンすると遅延はありません)。私はいつかの後にDBサーバーをシャットダウンすると、読み取りタイムアウトが設定されているとは思わない。あなたのウェブサイトは以前と同じように応答しなくなります:(それはなぜ起こっているのですか) – anusuya

関連する問題