PolarDBは、セッションレベルの接続プールとトランザクションレベルの接続プールをサポートします。 ビジネス要件に基づいて接続プールのタイプを選択できます。 接続プールは、多数の接続を繰り返し確立する必要をなくすことで、データベース接続のオーバーヘッドを減らすのに役立ちます。
使用上の注意
接続プールの設定を変更した場合、新しい設定は変更後に作成された接続に対してのみ有効になります。 接続プールの設定を変更する方法については、「PolarProxyの設定」をご参照ください。
接続プールは、アカウントのIPアドレスベースの認証をサポートしていません。 アクセスIPアドレスに基づいて同じアカウントに異なるデータベースまたはテーブル権限を付与すると、接続プール機能を有効にした後に権限の問題が発生する可能性があります。 たとえば、
user@192.xx.xxを付与した場合などです。 1
database_a
へのアクセス権限をしますが、user@192.xx.xxは付与しません。 2
、接続が再利用されるとアクセス許可の問題が発生する可能性があります。database_a
へのアクセス許可をこのトピックでは、PolarDB PolarProxyの接続プール機能について説明します。 この機能は、アプリケーションの接続プール機能には影響しません。 アプリケーションが接続プールをサポートしている場合、PolarDB PolarProxyの接続プール機能を使用する必要はありません。
セッションレベルの接続プール
セッションレベルの接続プールのしくみ
短期間の接続が頻繁に発生すると、データベースの負荷が増加します。 セッションレベルの接続プールを使用すると、頻繁な短期間の接続によって引き起こされる負荷を減らすことができます。 アプリケーション接続が切断されると、システムは接続がアイドルかどうかを確認します。 接続がアイドル状態の場合、PolarProxyは接続プール内の接続を短時間保持します。 新しい要求が受信されると、アイドル接続が
user
、clientip
、dbname
などの要求パラメータで指定された条件に一致する場合、システムはアイドル接続を提供します。 これにより、データベースへの新しい接続を確立するために必要なオーバーヘッドが削減されます。 接続プール内のアイドル接続が条件に一致しない場合、システムはデータベースへの新しい接続を確立します。制限事項
セッションレベルの接続プールを使用して、データベースへの同時接続の数を減らすことはできません。 セッションレベルの接続プールを使用すると、アプリケーションからデータベースへの接続が確立される頻度のみを減らすことができます。 このようにして、MySQLで消費されるメインスレッドの数が減り、サービスパフォーマンスが向上します。 ただし、接続プール内のアイドル接続は、データベースが許可する接続数の全体的な制限にカウントされます。
セッションレベルの接続プールは、多数の低速SQLステートメントによって引き起こされる保留中の接続の問題を解決できません。 この問題を解決するには、スローSQLステートメントの数を減らします。
トランザクションレベルの接続プール
トランザクションレベルの接続プールの仕組み
トランザクションレベルの接続プールは、データベースへの直接接続の数と、頻繁な短期間の接続によって引き起こされる負荷を減らすのに役立ちます。
トランザクションレベルの接続プール機能を有効にすると、アプリケーションとPolarDB PolarProxyの間に何千もの接続を確立できます。 ただし、PolarProxyとバックエンドデータベース間には数十または数百の接続しか確立されていません。
PolarDB PolarProxyは接続数を制限しません。 PolarDBクラスターエンドポイントへの最大接続数は、バックエンドデータベースの計算ノードの仕様によって異なります。 トランザクションレベルの接続プール機能が無効になっている場合、アプリケーションが要求を送信するたびに、システムはプライマリノードと各読み取り専用ノードに接続を作成する必要があります。
トランザクションレベルの接続プール機能が有効になると、リクエストを送信するアプリケーションはまずPolarDB PolarProxyに接続します。 PolarProxyは、アプリケーションとデータベース間の接続をすぐには確立しません。 PolarProxyは、トランザクションレベルの接続プール内のアイドル接続が、
user
、dbname
、systemなどのリクエストパラメーターで指定された条件と一致するかどうかを確認します。 条件に一致するアイドル接続がない場合、PolarProxyはデータベースへの新しい接続を確立します。 アイドル接続が条件に一致する場合、PolarProxyは接続を再利用します。 トランザクションがコミットされた後、接続は他の要求のために接続プールに保持される。制限事項
次のいずれかの操作を実行すると、接続が閉じられるまで接続はロックされます。 ロックされた接続は接続プールに保持されなくなり、他の要求では使用できなくなります。
PREPAREステートメントを実行します。
一時テーブルを作成します。
ユーザー変数を変更します。
多数のログエントリを受け取ります。 たとえば、16 MBを超えるログエントリを受け取ることができます。
LOCK TABLEステートメントを実行します。
1つのステートメント文字列を使用して複数のステートメントを実行します。
ストアドプロシージャを呼び出します。
FOUND_ROWS、ROW_COUNT、およびLAST_INSERT_ID関数はサポートされていません。 関数を呼び出すことはできますが、不正確な結果が返される場合があります。
PolarProxy V1.13.11以降を使用する場合は、
SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT *
ステートメントの直後にSELECT FOUND_ROWS()
ステートメントを追加できます。 この方法は、オープンソースMySQLでは推奨されなくなりました。SELECT FOUND_ROWS()
ステートメントをSELECT COUNT(*) FROM tb1
ステートメントに置き換えることができます。 詳細については、「FOUND_ROWS() 」をご参照ください。SELECT LAST_INSERT_ID()
ステートメントをINSERT
ステートメントの直後に追加して、クエリ結果の正確性を確保できます。
接続に
wait_timeout
パラメーターを設定した後、wait_timeout
パラメーターの値がアプリケーションに反映されない場合があります。 これは、アプリケーションがリクエストを開始するたびに、PolarProxyが接続プールから接続を選択するためです。wait_timeout
パラメーターで指定された時間が経過すると、バックエンドデータベースへの接続のみが閉じられ、アプリケーションへの接続は保持されます。接続プールは、
sql_mode
、character_set_server
、collation_server
、およびtime_zone
変数を使用して、リクエストを接続に照合します。 リクエストに他のセッションレベルのシステム変数が含まれている場合は、接続の確立後にSETステートメントを実行してこれらの変数を指定する必要があります。 そうでなければ、接続プールは、システム変数が変更される接続を再利用し得る。接続は再利用することができる。
SELECT connection_id()
ステートメントを実行すると、同じ接続に対して異なるスレッドID
が返される場合があります。接続は再利用することができる。
SHOW PROCESSLIST
ステートメントの出力に含まれるIPアドレスとポート番号、またはSQL Explorerページに表示されるIPアドレスとポート番号は、アプリケーションのIPアドレスとポート番号と異なる場合があります。PolarProxyは、各ノードで実行されたSHOW PROCESSLISTステートメントの結果をマージし、最終結果をクライアントに返します。 トランザクションレベル接続プール機能を有効にすると、クライアントとPolarProxy間の接続の
スレッドID
は、PolarProxyとデータベース間の接続のスレッドIDとは異なります。 KILLコマンドを実行すると、ERROR 1094 (HY000): Unknown thread id: xxxエラーメッセージが返されます。
接続プールの選択方法
接続プール機能を有効にするかどうかを決定し、次の推奨事項に基づいて接続プールのタイプを選択できます。
サービスには少数の接続が必要であり、必要な接続のほとんどは永続的な接続であるか、サービスで十分に確立された接続プールを使用できます。 この場合、PolarDBが提供する接続プール機能を有効にする必要はありません。
サービスには、数万の接続などの多数の接続が必要です。または、サービスは、ビジネスサーバーのスケールアップまたはスケールアウトに基づいて接続が線形に増加するサーバーレスサービスです。 この場合、このトピックの「制限」セクションで説明されているシナリオでサービスが実行されない場合は、トランザクションレベルの接続プール機能を有効にできます。
サービスは、このトピックの「制限」セクションで説明されているシナリオで実行されます。 この場合、セッションレベルの接続プール機能を有効にできます。