接続文字列のコネクションプーリングパラメータ

データベース接続文字列でコネクションプールサイズ、タイムアウト、アイドル設定を構成する方法。PostgreSQL、MySQL、MongoDB、ORMのプーリングを解説します。

Best Practices

詳細な説明

コネクションプーリングとは

コネクションプーリングは、クエリごとに新しい接続を開く代わりに、事前に確立されたデータベース接続のセットを再利用します。これにより接続オーバーヘッドが大幅に削減され、同時リクエストを処理する本番アプリケーションには不可欠です。

プーリングが重要な理由

データベース接続の確立にはTCPハンドシェイク、認証、TLSネゴシエーションが含まれ、通常1接続あたり20-100msかかります。プーリングを使用すると:

  • 100の同時リクエストを処理するWebサーバーが、例えば20接続のプールを共有
  • 各リクエストが接続を借り、クエリを実行し、プールに返却
  • リクエストごとの接続セットアップオーバーヘッドなし

データベース別のプールパラメータ

PostgreSQL(pgBouncer / ドライバーレベル)

postgresql://user:pass@host:5432/db?connection_limit=20&pool_timeout=30

PgBouncerなどの外部プーラーを使用する場合:

postgresql://user:pass@pgbouncer-host:6432/db?pgbouncer=true

Prisma固有のpgbouncer=trueによるプーリングは、PgBouncerのトランザクションプーリングモードと互換性のないプリペアドステートメントを無効にします。

MySQL

mysql://user:pass@host:3306/db?connectionLimit=10&waitForConnections=true&queueLimit=0
パラメータ 目的 デフォルト
connectionLimit 最大プールサイズ 10
waitForConnections プール満杯時にキュー true
queueLimit 最大キューサイズ(0=無制限) 0
idleTimeout アイドル接続を閉じるまで(ms) 60000

MongoDB

mongodb://user:pass@host:27017/db?maxPoolSize=50&minPoolSize=5&maxIdleTimeMS=30000
パラメータ 目的 デフォルト
maxPoolSize ホストごとの最大接続数 100
minPoolSize 最小アイドル接続数 0
maxIdleTimeMS アイドル接続タイムアウト 0(制限なし)
waitQueueTimeoutMS 接続待ちの最大時間 0(制限なし)

サイジングガイドライン

プールサイズの一般的な計算式:

pool_size = (コア数 * 2) + 有効ディスク数

SSDストレージを持つ典型的な4コアサーバーでは、約10のプールサイズが推奨されます。PostgreSQLのドキュメントでは、合計接続数(すべてのアプリケーションインスタンス全体)をmax_connections(デフォルト100)以下に保つことを推奨しています。

接続が多すぎるとメモリを浪費し(PostgreSQLの各接続は約10MBのRAMを使用)、少なすぎるとリクエストのキューイングが発生します。控えめに始めて、監視に基づいてスケールしてください。

ユースケース

高い同時実行性を処理するために本番Webアプリケーションのチューニング、トラフィックスパイク時の接続枯渇の防止、接続再利用が重要なサーバーレス環境の最適化。

試してみる — Connection String Builder

フルツールを開く