34

Railsdatabase.ymlの次の設定について疑問に思っていました。

デフォルトでは、ActiveRecordの接続プールのデータベース接続数は5に設定されています。

development:
  ...
  pool: 5

ただし、デフォルトでは、Rails3はシングルスレッドです。デフォルトで5つの接続が必要なのはなぜですか?

私が理解している限り、単一のスレッド化されたRailsアプリは、一度に複数のデータベース操作をトリガーすることはできません。なぜ、より多くの接続を開いたままにする必要があるのでしょうか。

2つの接続が理にかなっていると思いますので、もう1つがタイムアウトしても、常に1つのアクティブな接続がありますが、5つの接続を保持することは私には少し奇妙に思えます。

私は何かが足りないのですか?

更新他の誰かが興味を持っているなら、私はそれを説明するコミットを見つけました: https ://github.com/rails/rails/commit/b700153507b7d539a57a6e3bcf03c84776795051

実際、これらのデフォルト設定は意味がありません。修正されましたが、テストスイートのために一時的に(1年前に)元に戻されました。

4

2 に答える 2

18

ここでのパーティーにはかなり遅れましたが、今日、本番環境でデータベース接続を使い果たしました。

多くの人と同じように、私は Sidekiq を使用して、たとえばメールの送信などの非同期ジョブを実行しています。Sidekiq はマルチスレッド プロセスとして実行されることに注意してください。

したがって、私はシングルスレッドの Rails アプリケーションを持っているだけではないため、この回答は尋ねられた質問には直接当てはまりませんが、マルチスレッドの Rails アプリは最近では比較的普通だと思うので、ここで何か言う価値があると思いました。

これは、キューに入れることができ、5 秒 (エラーをスローする前にデータベース接続を待機するデフォルトのタイムアウト時間) より長くかかるすべてのジョブを処理するのに十分な接続を作成するように、プール サイズを調整する必要があることを意味します。

于 2015-05-14T05:44:09.607 に答える
7

接続の管理

Mongrel/Passenger/etc のようなシングルスレッド サーバーの接続プールの主な利点は、Rails のメイン リクエスト処理の外にある Rack ハンドラで接続が確立/維持されることです。これにより、さまざまな方法で使用されるため、接続を一度確立するのではなく、何度も確立することができます。目標は、確立された接続を再利用し、接続数を最小限に抑えることです。これにより、特定のリクエスト処理サイクル内で再接続する必要がなくなり、場合によってはリクエスト間でも再接続する必要がなくなります(正しく思い出せば)。

複数の同時接続

ほとんどのユース ケース (Mongrel/Passenger) はシングル スレッドであり、一度に 1 つの接続しか使用できませんが、マルチスレッドを完全にサポートする JRuby と環境/アプリ サーバーがあります。Rails は 2.2 からスレッドセーフになっています

  • 接続プーリングは ActiveRecord の内部で処理されるため、すべてのアプリケーション サーバーは基本的に同じように動作する必要があります。

  • データベース接続プールは空の状態で開始され、要求に応じて時間の経過とともに接続が作成されます。このプールの最大サイズのデフォルトは 5 で、database.yml で設定されます。

  • リクエストとユーザーは、このプールからの接続を共有します。リクエストは、最初にデータベースにアクセスする必要があるときに接続をチェックアウトし、リクエストの最後に接続をチェックインします。

  • Rails.threadsafe を使えば!モードの場合、複数のスレッドが同時に複数の接続にアクセスしている可能性があるため、リクエストの負荷によっては、いくつかの接続に対して複数のスレッドが競合する可能性があります。

シングルスレッドアプリを使用している場合は、それに応じて変更できます。デフォルトは、ほとんどのユーザーのニーズに応じて 5 です。現在、マルチスレッド アプリを使用するのは通常のことです。

于 2013-02-28T09:51:35.457 に答える