PolarDBは、セッションレベルの接続プールとトランザクションレベルの接続プールをサポートします。 ビジネス要件に基づいて接続プールタイプを選択できます。 接続プールは、多数の接続を繰り返し確立する必要をなくすことで、データベース接続のオーバーヘッドを減らすのに役立ちます。
使用上の注意
接続プールの設定を変更した場合、新しい設定は変更後に作成された接続に対してのみ有効になります。 接続プールの設定を変更する方法については、「PolarProxyの設定」をご参照ください。
接続プール機能は、アカウントに対するIP固有の権限をサポートしていません。 接続プール機能を有効にして、異なるIPアドレスを使用するアカウントにデータベースまたはテーブルのアクセス権限を付与すると、権限エラーが発生する可能性があります。 たとえば、
database_a
へのアクセス権限をuser@192.xx.xx.1
に付与し、database_a
へのアクセス権限をuser@192.xx.xx.2
に付与しない場合、接続の再利用時に権限エラーが発生することがあります。ビジネスで
COM_STATISTICS
ステートメントを頻繁に実行する場合は、接続プール機能を有効にしないことを推奨します。 データベースでのこのステートメントの実装は、最初にロックしてからすべての接続をトラバースすることです。 接続プール機能を有効にすると、非永続接続は永続接続に変換されます。 これは、このステートメントのボトルネックを引き起こす永続的な接続の数の増加につながり、パフォーマンスの低下をもたらす可能性があります。 必要な場合を除き、このステートメントを実行しないことを推奨します。 頻繁な実行は、深刻なパフォーマンス低下を引き起こし、ビジネス全体の応答時間に影響を与える可能性があります。このトピックでは、PolarProxyの接続プール機能について説明します。 この機能は、アプリケーションの接続プール機能には影響しません。 アプリケーションが接続プールをサポートしている場合、PolarProxyの接続プール機能を使用する必要はありません。
セッションレベルの接続プール
セッションレベルの接続プールのしくみ
短期間の接続が頻繁に発生すると、データベースの負荷が増加します。 セッションレベルの接続プールを使用すると、頻繁な短期間の接続によって引き起こされる負荷を減らすことができます。 アプリケーション接続が切断されると、システムは接続がアイドルかどうかを確認します。 接続がアイドル状態の場合、PolarProxyは接続プール内の接続を短時間保持します。 新しい要求が受信されると、アイドル接続が
user
、clientip
、dbname
などの要求パラメータで指定された条件に一致する場合、システムはアイドル接続を提供します。 これにより、データベースへの新しい接続を確立するために必要なオーバーヘッドが削減されます。 接続プール内のアイドル接続が条件に一致しない場合、システムはデータベースへの新しい接続を確立します。制限事項
セッションレベルの接続プールを使用して、データベースへの同時接続の数を減らすことはできません。 セッションレベルの接続プールを使用すると、アプリケーションからデータベースへの接続が確立される頻度のみを減らすことができます。 このようにして、MySQLで消費されるメインスレッドの数が減り、サービスパフォーマンスが向上します。 ただし、接続プール内のアイドル接続は、データベースが許可する接続数の全体的な制限にカウントされます。
セッションレベルの接続プールは、多数の低速SQLステートメントによって引き起こされる保留中の接続の問題を解決できません。 この問題を解決するには、スローSQLステートメントの数を減らします。
トランザクションレベルの接続プール
トランザクションレベルの接続プールの仕組み
トランザクションレベルの接続プールは、データベースへの直接接続の数と、頻繁な短期間の接続によって引き起こされる負荷を減らすのに役立ちます。
トランザクションレベルの接続プール機能を有効にすると、アプリケーションとPolarProxyの間に何千もの接続を確立できます。 ただし、PolarProxyとバックエンドデータベース間には数十または数百の接続しか確立されていません。
PolarProxyは接続数を制限しません。 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の接続プール機能を有効にする必要はありません。
サービスには、数万の接続などの多数の接続が必要です。または、サービスは、ビジネスサーバーのスケールアップまたはスケールアウトに基づいて接続が線形に増加するサーバーレスサービスです。 この場合、このトピックの「制限」セクションで説明されているシナリオでサービスが実行されない場合は、トランザクションレベルの接続プール機能を有効にできます。
サービスは、このトピックの「制限」セクションで説明されているシナリオで実行されます。 この場合、セッションレベルの接続プール機能を有効にできます。