web-dev-qa-db-ja.com

シングルスレッドのデータベース接続プールdatabase.ymlの正しい設定Railsアプリケーション

Rails database.yml:の次の設定について疑問に思っていました:

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

development:
  ...
  pool: 5

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

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

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

何か不足していますか?

更新誰か他の人が気になるなら、私はそれを説明するコミットを見つけました: https://github.com/Rails/rails/commit/b700153507b7d539a57a6e3bcf03c84776795051

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

34
chris_b

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

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

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

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

18
djb

接続を管理する

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

複数の同時接続

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

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

  • データベース接続プールは空から始まり、必要に応じて時間をかけて接続を作成します。このプールの最大サイズはデフォルトで5で、database.ymlで設定されます。

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

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

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

7
Gopal S Rathore