Amazon のドライバーによるセッション管理について QLDB - Amazon Quantum 台帳データベース (Amazon QLDB)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon のドライバーによるセッション管理について QLDB

重要

サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了QLDBまで Amazon を使用できます。詳細については、「Amazon Ledger QLDB を Amazon Aurora Postgre に移行するSQL」を参照してください。

リレーショナルデータベース管理システム (RDBMS) の使用経験がある場合は、同時接続に精通しているかもしれません。QLDB トランザクションはHTTPリクエストメッセージとレスポンスメッセージで実行されるため、 には従来のRDBMS接続の概念が同じではありません。

ではQLDB、同様の概念はアクティブなセッション です。セッションは概念的にはユーザーログインに似ており、これによって、台帳に対するデータトランザクションリクエストの情報が管理されます。アクティブセッションとは、トランザクションがアクティブに実行されているセッションを意味します。トランザクションが終了したばかりで、サービスが別のトランザクションがすぐに開始されることを期待している状態もセッションと見なされることがあります。QLDB は、セッションごとに 1 つのアクティブに実行されているトランザクションをサポートします。

台帳ごとの同時アクティブセッションの制限数は、「Amazon のクォータと制限 QLDB」に定義されています。この制限に達すると、トランザクションの開始を試行するセッションはエラー (LimitExceededException) になります。

QLDB ドライバーを使用してアプリケーションでセッションプールを設定するベストプラクティスについては、「Amazon QLDBドライバーの推奨事項 QldbDriver オブジェクトの設定」の「」を参照してください。

セッションライフサイクル

次のQLDBセッションAPIオペレーションのシーケンスは、QLDBセッションの一般的なライフサイクルを表します。

  1. StartSession

  2. StartTransaction

  3. ExecuteStatement

  4. CommitTransaction

  5. 複数のトランザクションを開始するには手順 2 ~ 4 を繰り返します (一度に 1 つのトランザクション)。

  6. EndSession

セッションの期限切れ

QLDB は、トランザクションをアクティブに実行しているかどうかにかかわらず、合計 13~17 分後にセッションを期限切れにし、破棄します。ハードウェア障害、ネットワーク障害、アプリケーションの再起動など、さまざまな理由でセッションが失われたり、障害が生じたりすることがあります。QLDB は、クライアントアプリケーションがセッション障害に対して回復力を持つように、セッションに最大有効期間を適用します。

QLDB ドライバーでのセッション処理

を使用して AWS SDKQLDBセッション と直接やり取りすることはできますがAPI、これにより複雑さが増し、コミットダイジェストを計算する必要があります。QLDB は、このコミットダイジェストを使用してトランザクションの整合性を確保します。この を直接操作する代わりにAPI、 QLDBドライバーを使用することをお勧めします。

ドライバーは、トランザクションデータ の上に高レベルの抽象化レイヤーを提供しますAPI。SendCommand API 呼び出しを管理することで、台帳データに対して PartiQL ステートメントを実行するプロセスを合理化します。これらのAPI呼び出しには、セッション、トランザクションの管理、エラー発生時の再試行ポリシーなど、ドライバーが処理するいくつかのパラメータが必要です。

セッションプールの概要

古いバージョンのQLDBドライバー (Java v1.1.0 など) では、ドライバーオブジェクトの 2 つの実装として、標準、非プール、QldbDriverおよび が提供されましたPooledQldbDriver。名前が示すとおり、PooledQldbDriver では、トランザクション間で再利用するセッションプールが維持されます。

ユーザーからのフィードバックに基づいて、開発者は、標準ドライバーを使用せず、デフォルトでプーリング機能とそのメリットを得ることができます。そのため、PooledQldbDriver を削除し、そのセッションプール機能を QldbDriver に移動しました。この変更した機能は、各ドライバーの最新リリースに含まれています (例: Java v2.0.0)。

このドライバーにより、次の 3 つのレベルの抽象化が可能です。

  • ドライバー (プールされたドライバー実装) — トップレベルの抽象化。ドライバーは、セッションのプールを維持し、管理します。ドライバーにトランザクションを実行させると、ドライバーはプールからセッションを選択し、それを使用してトランザクションを実行します。セッションエラー (InvalidSessionException) が原因でトランザクションが失敗した場合、ドライバーは別のセッションを使用してトランザクションを再試行します。基本的に、ドライバーはフルマネージドのセッションエクスペリエンスを提供します。

  • セッション — ドライバーの 1 つ下のレベルとなる抽象化です。セッションはプール内に存在し、セッションのライフサイクルはドライバーが管理しています。トランザクションが失敗すると、ドライバーは同じセッションを使用して指定された回数までトランザクションを再試行します。ただし、セッションでエラー (InvalidSessionException) が発生した場合、 は内部でQLDB破棄します。その場合、ドライバーは、プールから別のセッションを取得して、トランザクションを再試行する必要があります。

  • トランザクション — 最も下のレベルの抽象化です。トランザクションはセッション内に存在し、トランザクションのライフサイクルはセッションによって管理されています。エラーが発生した場合、セッションによって、トランザクションが再試行される必要があります。また、セッションは、コミットされていない、またはキャンセルされたオープントランザクションをリークさせない役割も果たします。

各ドライバーの最新バージョンでは、抽象化のドライバーレベルでのみオペレーションを実行できます。個々のセッションやトランザクションを直接制御することはできません (つまり、新しいセッションやトランザクションを手動で開始するAPI操作はありません)。

セッションプールとトランザクションロジック

各ドライバーの最新リリースでは、プールを使用しないドライバーオブジェクトが実装されなくなりました。デフォルトでは、QldbDriver オブジェクトがセッションプールを管理します。トランザクション実行の呼び出しを行うと、ドライバーは次の手順を実行します。

  1. ドライバーは、セッションプールの制限に達したかどうかをチェックします。達している場合、ドライバーは NoSessionAvailable をスローします。それ以外の場合は、次のステップに進みます。

  2. ドライバーは、利用可能なセッションがプール内にあるかどうかをチェックします。

    • プール内に使用可能なセッションがある場合、ドライバーはそのセッションを使用してトランザクションを実行します。

    • プール内に使用可能なセッションがない場合、ドライバーはセッションを新規作成し、それを使用してトランザクションを実行します。

  3. ステップ 2 でセッションを取得した後、ドライバーは、セッションインスタンス上で execute オペレーションを呼び出します。

  4. セッションの execute オペレーション内で、startTransaction を呼び出すことで、トランザクションの開始を試行します。

    • セッションが有効でない場合は、startTransaction の呼び出しが失敗し、ドライバーはステップ 1 に戻ります。

    • startTransaction の呼び出しが成功すると、ドライバーは次のステップに進みます。

  5. ドライバーは Lambda 式を実行します。この Lambda 式には、PartiQL ステートメントを実行する 1 つ以上の呼び出しを含めることができます。Lambda 式の実行がエラーなしで終了すると、ドライバーはトランザクションのコミットに進みます。

  6. トランザクションのコミットの結果は、次に示す 2 つのいずれかになります。

    • コミットが成功し、ドライバーは制御をアプリケーションコードに返します。

    • オプティミスティック同時実行制御 (OCC) の競合によりコミットが失敗します。この場合、ドライバーは同じセッションを使用して手順 4 ~ 6 を再試行します。再試行の最大数は、アプリケーションコードで設定可能です。デフォルトの制限数は 4 です。

注記

ステップ 4 ~ 6 の間に InvalidSessionException がスローされた場合、ドライバーはセッションを閉じたものとしてマークし、ステップ 1 に戻ってトランザクションを再試行します。

手順 4 ~ 6 で他の例外がスローされた場合、ドライバーは、例外が発生した状態で再試行可能かどうかをチェックします。可能な場合は、指定された再試行回数までトランザクションを再試行します。可能でない場合は、アプリケーションコードに例外を伝播 (バブルアップしてスロー) します。

セッションをプールに戻す

アクティブなトランザクションの過程で InvalidSessionException が発生した場合、ドライバーはセッションをプールに戻しません。QLDB は代わりにセッションを破棄し、ドライバーはプールから別のセッションを取得します。それ以外の場合、ドライバーはセッションをプールに戻します。