すべてのプロダクト
Search
ドキュメントセンター

PolarDB:接続プール

最終更新日:Jul 18, 2026

PolarDB は、セッションレベルおよびトランザクションレベルの 2 種類の接続プールをサポートしています。接続プールは、各リクエストごとに新しい接続を確立する代わりに既存の接続を再利用することで、データベース接続のオーバーヘッドを削減します。

ここで説明する接続プールは、PolarDB のプロキシレイヤーである PolarProxy の機能です。アプリケーション内に組み込まれた接続プールには影響しません。アプリケーションがすでに独自の接続プールを管理している場合は、この機能を有効にする必要はありません。

仕組み

セッションレベル接続プール

Session-level connection pool diagram

アプリケーションの接続が閉じられると、PolarProxy はその接続がアイドル状態かどうかを確認します。アイドル状態の場合、PolarProxy は短時間の間、その接続をプール内に保持します。userclientip、および dbname パラメーターが一致する次の受信リクエストは、そのアイドル接続を再利用し、新しい接続を開くコストを節約します。一致する接続が見つからない場合、PolarProxy はデータベースに対して新しい接続を開きます。

セッションレベルプールは接続確立の頻度を削減し、消費される MySQL メインスレッド数を減らしてスループットを向上させます。ただし、同時接続数の合計は削減されません。アイドル状態のプール接続もデータベースの接続制限にカウントされます。

トランザクションレベル接続プール

Transaction-level connection pool diagram

トランザクションレベルプールは、データベースへの直接接続数と短時間接続によるオーバーヘッドの両方を削減します。アプリケーションは PolarProxy に対して数千もの接続を開くことができますが、PolarProxy はバックエンドデータベースに対して数十〜数百の接続しか維持しません。

アプリケーションがリクエストを送信すると、PolarProxy はすぐにバックエンド接続を開きません。代わりに、プール内で userdbname、およびシステム変数(sql_modecharacter_set_servercollation_servertime_zone)が一致するアイドル接続を検索します。一致する接続が存在する場合、PolarProxy はそれを再利用します。トランザクションが完了すると、接続はプールに戻され、他のリクエストで使用可能になります。

PolarProxy はアプリケーション側の接続数に制限を設けません。PolarDB クラスターエンドポイントへの最大接続数は、バックエンドコンピュートノードの仕様によって決まります。トランザクションレベルプールを使用しない場合、システムはすべてのリクエストに対してプライマリノードおよび各読み取り専用ノードに個別の接続を開く必要があります。

接続プールの選択

次の表を使用して、シナリオに適したプールタイプを選択してください。

シナリオ 推奨プール 理由
接続数が少なく、主に接続保持されている、またはアプリケーションがすでに独自のプールを持っている なし (無効) PolarDB プールを有効にしてもオーバーヘッドが増加し、メリットがない
数万の接続がある、またはサーバーレスで接続数が線形にスケールする トランザクションレベル 多数のアプリケーション接続を少数のバックエンド接続に多重化できる
短期接続のみ(トランザクションレベルの制限事項 セッションレベル 完全な多重化を必要とせずに接続頻度を削減できる
COM_STATISTICS を頻繁に実行する なし (無効) プールを有効にすると、非永続的な接続が永続的な接続に変換され、永続的接続数が増加して COM_STATISTICS 内でロック後に走査するボトルネックが発生します。頻繁な実行は深刻なパフォーマンス劣化を引き起こし、全体のビジネス応答時間に影響を与える可能性があります。
大量のスロー SQL 文により保留中の接続が発生している なし (無効) 接続プールはスロークエリによる競合を解決しません。代わりにスロークエリを削減してください

制限事項

セッションレベルの制限事項

  • セッションレベルプールは同時実行数ではなく接続頻度を削減します。プール内のアイドル接続もデータベースの合計接続制限にカウントされます。

  • セッションレベルプールは、スロー SQL 文によって引き起こされる保留中の接続を解決しません。

トランザクションレベルの制限事項

以下の操作はセッションの継続中に接続をロックします。ロックされた接続はプールに戻されず、他のリクエストで使用できなくなります。

操作 回避策
PREPARE 文を実行する ドライバーがサポートしている場合は、クライアント側のプリペアドステートメントを使用する
一時テーブルを作成する 一意のセッション識別子を持つ通常のテーブルを使用し、完了後に削除する
ユーザー変数を変更する セッション開始時に変数を設定するか、各クエリで値を明示的に渡す
16 MB を超えるログエントリを受信する 大規模なログ書き込みを小さなバッチに分割する
LOCK TABLE 文を実行する 代わりに行レベルロック (SELECT ... FOR UPDATE) を使用する
単一の文文字列で複数の文を実行する 個別の文に分割する
ストアドプロシージャを呼び出す 可能な限りロジックをアプリケーション層に移行する

サポートされていない関数

FOUND_ROWS()ROW_COUNT()、および LAST_INSERT_ID() は呼び出せますが、接続が再利用される際に不正確な結果を返す可能性があります。

関数 回避策
FOUND_ROWS() PolarProxy V1.13.11 以降では、SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT * の直後に SELECT FOUND_ROWS() を配置してください。ただし、この方法はオープンソース MySQL では推奨されなくなりました。代わりに SELECT COUNT(*) FROM tb1 に置き換えてください。詳細については、「FOUND_ROWS()」をご参照ください。
LAST_INSERT_ID() INSERT 文の直後に SELECT LAST_INSERT_ID() を配置して、正確な結果を取得してください。
ROW_COUNT() 回避策はありません。この関数は呼び出せますが、接続が再利用される際に不正確な結果を返す可能性があります。

その他の動作の違い

  • `wait_timeout`:タイムアウトが経過すると、バックエンド接続のみが閉じられます。アプリケーション側の PolarProxy への接続は開いたままになります。これは、PolarProxy が各新しいリクエストに対してプールから接続を選択するためです。

  • セッション変数:プールは sql_modecharacter_set_servercollation_server、および time_zone を使用して接続を照合します。リクエストがこれらの変数以外のセッションレベルシステム変数に依存する場合、各接続確立後に SET 文を実行してそれらを設定してください。そうしないと、予期しない変数値を持つ接続が再利用される可能性があります。

  • 分離レベル:デフォルトの READ COMMITTED 分離レベルを維持してください。クライアントが明示的に分離レベルを変更した場合、トランザクション終了後に接続はプールに戻され、他のリクエストで再利用される可能性があり、分離レベルの一貫性が失われるおそれがあります。

  • `SELECT connection_id()`:接続がリクエスト間で再利用されるため、同じ接続のように見えても異なるスレッド ID を返す可能性があります。

  • `SHOW PROCESSLIST` および SQL Explorer:接続が PolarProxy を通じて多重化されるため、表示される IP アドレスおよびポート番号は、アプリケーションの実際の IP アドレスおよびポートと異なる場合があります。

  • `KILL` コマンドERROR 1094 (HY000): Unknown thread id: xxx が返されます。これは、クライアントと PolarProxy 間のスレッド ID が、PolarProxy とデータベース間のスレッド ID と異なるためです。PolarProxy は、すべてのノードからの SHOW PROCESSLIST の結果をマージしてからクライアントに返します。

注意事項

  • 接続プールの設定は、変更後に作成された接続にのみ適用されます。既存の接続には影響しません。構成手順については、「PolarProxy の構成」をご参照ください。

  • 接続プールはアカウントの IP 固有の権限をサポートしていません。user@192.xx.xx.1database_a へのアクセス権を付与し、user@192.xx.xx.2 には付与していない場合、その接続が再利用されたときに権限エラーが発生する可能性があります。接続プーリングを有効にしている場合は、同じアカウントに対して異なる IP アドレスで異なる権限を設定しないでください。