web-dev-qa-db-ja.com

Railsデータベース接続プールの仕組み

私はRailsデータベース接続プールの概念を学習しています。Railsアプリケーションでは、プールサイズ5を定義しました。

接続プールのサイズについての私の理解は以下の通りです。

  1. サーバーが起動するとRailsはdatabase.ymlファイルで定義されたn個の接続を自動的に作成します。私の場合、プールサイズが5であるため、5つの接続が作成されます。

  2. データベースにアクセスする必要がある場合は、すべてのhttpリクエストで、Railsは接続プールからの利用可能な接続を使用してリクエストを処理します。

しかし、私の質問は、一度に1000リクエストに達すると、接続プールのサイズが5しかないため、ほとんどのリクエストがデータベース接続にアクセスできないことです。

Rails接続プールは正しいですか?

ありがとう、

14
user2274074

このプールサイズは単一のプロセス用です。もちろん、アプリケーションが複数のプロセスで実行されている場合、uはそれぞれに5つのデータベース接続を持ちます。サーバーが同時に1000のリクエストに見舞われた場合、サーバーはこれらの接続間でリクエストを分散し、サーバーがいっぱいになると、残りのリクエストは順番を待ちます。

15
Raza

はい、ドキュメントから:

接続プールは、スレッドアクセスを限られた数のデータベース接続に同期します。基本的な考え方は、各スレッドがプールからデータベース接続をチェックアウトし、その接続を使用して、接続を再度チェックインすることです。ConnectionPoolは完全にスレッドセーフであり、接続を2つのスレッドで同時に使用できないようにします。 、ConnectionPoolの契約が正しく守られている限り。また、接続よりもスレッドの数が多い場合も処理します。すべての接続がチェックアウトされ、スレッドが接続をチェックアウトしようとすると、ConnectionPoolは他のスレッドが接続をチェックインするまで待機します。

ソース: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html

Unicornのようなものをhttpサーバーとして使用する場合:

Unicornでは、各プロセスが独自の接続プールを確立するため、db pool設定が5で、Unicornワーカーが5人いる場合、最大25の接続を持つことができます。ただし、各Unicornワーカーは一度に1つの接続しか処理できないため、アプリが内部でスレッドを使用しない限り、各ワーカーは実際には1つのdb接続のみを使用します。

10
Laurens