Connection pooling#
クライアント全体でバックエンド接続を再利用するように接続プーリングを構成し、サーバーメモリのオーバーヘッドを削減し、多くの短期間のセッションを含むワークロードのスループットを向上させます。 Connection Managerのビルトインプーリングにより、ほとんどの展開でpgBouncerなどの外部ツールの必要性がなくなります。
DBAセットアップと移行ガイダンスについては Configuring connection pooling を、開発者ガイダンスについては Using connection pooling in your application を参照してください。
プールモードの構成#
bdr.alter_node_group_option
を使用してノードグループのプールモードを設定します。
SELECT bdr.alter_node_group_option(mygroup, server_pool_mode, transaction);
またはPGD CLIを使用して
pgd group mygroup set-option server_pool_mode transaction
server_pool_mode グループオプションは、プーリング動作を制御します。
Mode |
Behavior |
|---|---|
none |
プーリングはありません。各クライアント接続は、その有効期間全体にわたって専用のバックエンド接続を取得します。クライアントが切断すると、バックエンド接続が閉じます。このモードはデフォルトです。 |
session |
バックエンド接続は、最初に使用するときにクライアントに割り当てられ、クライアントが切断するとプールに返されます。接続マネージャーは、再利用のために接続を返し、セッション状態をリセットする前に Replicated large objects を実行します。 |
transaction |
バックエンド接続は、トランザクションの開始時に割り当てられ、トランザクションが終了するとプールに返されます。トランザクション間では、クライアントはバックエンド接続を保持しないため、他のクライアントが利用できるようにします。接続マネージャーは、再利用のために接続を返す前に Replicated large objects を実行し、セッション状態をリセットし、次のトランザクションでクライアントがサポートされている接続パラメーターを再適用します。 |
現在のプールモードは、 bdr.node_group_summary
ビューのserver_pool_mode 列に表示されます。
セッションパラメーターの管理#
接続マネージャーは、すべてのプールモードでバックエンドに特定の接続パラメーターのセットを転送します。認識するパラメーターはclient_encoding
、DateStyle 、TimeZone 、standard_conforming_strings
、application_name 、search_path
、およびextra_float_digits です。 -c name=value
構文を使用して、options
接続パラメーターを介して追加パラメーターを含めることができます。
トランザクション間でバックエンド接続が変更される可能性があるtransaction
モードでは、接続マネージャーは新しいバックエンドを割り当てるたびにこれらのパラメーターを再適用します。接続パラメーターのみが再適用されるため、
SET
コマンドを使用してトランザクションモードでセッションパラメーターを構成することは避けてください。
SET
で行われた変更は、バックエンド接続が変更されたときに保持されません。接続文字列の例については、
Using connection pooling in your application を参照してください。
準備されたステートメントを使用する#
拡張クエリプロトコルを介して送信されるプリペアドステートメントは、すべてのプールモードのトランザクションにわたってシームレスに動作します。接続マネージャーは、バックエンドで欠落しているプリペアドステートメントを自動的に検出し、オンデマンドで再準備し、クライアントとバックエンド間でステートメントの名前付けを透過的に管理します。
transaction
モードでは、各トランザクションの終了にバックエンド接続がプールに返されたときにDISCARD ALL
が実行され、PREPARE /EXECUTE
SQLステートメントで作成されたプリペアドステートメントの割り当てが解除されます。
PREPARE /EXECUTE
SQLステートメントを使用するトランザクション内で発行するか、代わりに拡張照会プロトコルを使用します。具体的な手順については、開発者ガイドの 準備されたステートメントを使用する を参照してください。
接続の再利用#
session およびtransaction
モードでは、クライアントが切断されるか、トランザクションが終了すると、接続マネージャーはバックエンド接続をプールに返します。クライアントがサポートされていない機能をトリガーするか、保留中のコマンドで接続を閉じると、接続マネージャーはそのバックエンド接続をプールに返すのではなく、破棄します。他のクライアントは影響を受けません。
未サポートの機能#
一部のPostgres機能は、接続プーリングと互換性がないため、サポートされていません。
セッション中に行われた
SET変更は、transactionモードでは持続しません。代わりに、接続文字列でセッションパラメーターを構成します。詳細は、 セッションパラメーターの管理 を参照してください。PREPARE/EXECUTE/DEALLOCATESQLステートメントはtransactionモードではサポートされていません。DISCARD ALLは、バックエンド接続がプールに返されたときに実行され、準備されたステートメントの割り当てが解除されます。これらのステートメントを使用するトランザクション内で発行するか、代わりに拡張照会プロトコルを使用します。詳細は、 準備されたステートメントを使用する を参照してください。ホールダブルカーソル
WITH HOLDは、transactionモードではサポートされていません。これらはトランザクション境界を超えて持続するため、トランザクションの終了時にバックエンド接続をプールに返すことと競合します。LISTENはtransactionモードではサポートされていません。LISTENサブスクリプションは、単一のトランザクションを超えて持続します。これは、バックエンド接続をプールに返すことと競合します。トランザクション境界を越えて保持されるアドバイザリロックは、
transactionモードではサポートされていません。トランザクションを超えてアクセスされる一時テーブルは、
transactionモードではサポートされていません。レプリケーション接続はすべてのプールモードで拒否されます。