接続文字列のコネクションプーリングパラメータ
データベース接続文字列でコネクションプールサイズ、タイムアウト、アイドル設定を構成する方法。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アプリケーションのチューニング、トラフィックスパイク時の接続枯渇の防止、接続再利用が重要なサーバーレス環境の最適化。