

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

# Amazon QLDB でドライバーを使用してセッションを管理する方法を理解する
<a name="driver-session-management"></a>

**重要**  
サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了まで Amazon QLDB を使用できます。詳細については、[「Amazon QLDB 台帳を Amazon Aurora PostgreSQL に移行する](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)」を参照してください。

リレーショナルデータベース管理システム (RDBMS) を使用した経験のある方は同時接続の知識をお持ちでしょう。QLDB の概念は、従来の RDBMS 接続とは異なります。HTTP のリクエストメッセージとレスポンスメッセージを使用してトランザクションを実行するからです。

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

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

QLDB ドライバーを使用してアプリケーション内のセッションプールを設定するベストプラクティスについては、「Amazon QLDB の推奨事項**」の「[QldbDriver オブジェクトの設定](driver.best-practices.md#driver.best-practices.configuring)」を参照してください。

**Contents**
+ [セッションライフサイクル](#driver-session-mgmt.lifecycle)
+ [セッションの期限切れ](#driver-session-mgmt.expiration)
+ [QLDB ドライバーでのセッション処理](#driver-session-mgmt.handling)
  + [セッションプールの概要](#driver-session-mgmt.pooling-overview)
  + [セッションプールとトランザクションロジック](#driver-session-mgmt.pooling-logic)
  + [セッションをプールに戻す](#driver-session-mgmt.pooling-return)

## セッションライフサイクル
<a name="driver-session-mgmt.lifecycle"></a>

次の [QLDB セッション API](https://docs.aws.amazon.com/qldb/latest/developerguide/API_Types_Amazon_QLDB_Session.html) オペレーションのシーケンスは、QLDB セッションの一般的なライフサイクルを示しています。

1. `StartSession`

1. `StartTransaction`

1. `ExecuteStatement`

1. `CommitTransaction`

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

1. `EndSession`

## セッションの期限切れ
<a name="driver-session-mgmt.expiration"></a>

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

## QLDB ドライバーでのセッション処理
<a name="driver-session-mgmt.handling"></a>

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

このドライバーにより、トランザクションデータ API 上に高レベルの抽象化レイヤーが形成されます。これにより [SendCommand](https://docs.aws.amazon.com/qldb/latest/developerguide/API_QLDB-Session_SendCommand.html) API コールを管理して、元帳データに対する [PartiQL](ql-reference.md) ステートメントの実行プロセスが合理化されます。これらの API コールにはいくつかのパラメータが必要です。これにより、ドライバーは、セッション、トランザクション、エラー発生時の再試行ポリシーの管理といった処理を行えるようになります。

**Topics**
+ [セッションプールの概要](#driver-session-mgmt.pooling-overview)
+ [セッションプールとトランザクションロジック](#driver-session-mgmt.pooling-logic)
+ [セッションをプールに戻す](#driver-session-mgmt.pooling-return)

### セッションプールの概要
<a name="driver-session-mgmt.pooling-overview"></a>

古いバージョンの QLDB ドライバー (例: [Java v1.1.0](https://github.com/awslabs/amazon-qldb-driver-java/releases/tag/v1.1.0)) では、プールを使用しない標準の `QldbDriver` と、`PooledQldbDriver` という、2 つのドライバーオブジェクトを実装していました。名前が示すとおり、`PooledQldbDriver` では、トランザクション間で再利用するセッションプールが維持されます。

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

このドライバーにより、次の 3 つのレベルの抽象化が可能です。
+ **ドライバー** (プールされたドライバー実装) — トップレベルの抽象化。ドライバーは、セッションのプールを維持し、管理します。ドライバーにトランザクションを実行させると、ドライバーはプールからセッションを選択し、それを使用してトランザクションを実行します。セッションエラー (`InvalidSessionException`) が原因でトランザクションが失敗した場合、ドライバーは別のセッションを使用してトランザクションを再試行します。基本的に、ドライバーはフルマネージドのセッションエクスペリエンスを提供します。
+ **セッション** — ドライバーの 1 つ下のレベルとなる抽象化です。セッションはプール内に存在し、セッションのライフサイクルはドライバーが管理しています。トランザクションが失敗すると、ドライバーは同じセッションを使用して指定された回数までトランザクションを再試行します。しかし、セッションでエラー (`InvalidSessionException`) が発生すると、QLDB はそのセッションを内部的に破棄します。その場合、ドライバーは、プールから別のセッションを取得して、トランザクションを再試行する必要があります。
+ **トランザクション** — 最も下のレベルの抽象化です。トランザクションはセッション内に存在し、トランザクションのライフサイクルはセッションによって管理されています。エラーが発生した場合、セッションによって、トランザクションが再試行される必要があります。また、セッションは、コミットされていない、またはキャンセルされたオープントランザクションをリークさせない役割も果たします。

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

### セッションプールとトランザクションロジック
<a name="driver-session-mgmt.pooling-logic"></a>

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

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

1. ドライバーは、利用可能なセッションがプール内にあるかどうかをチェックします。
   + プール内に使用可能なセッションがある場合、ドライバーはそのセッションを使用してトランザクションを実行します。
   + プール内に使用可能なセッションがない場合、ドライバーはセッションを新規作成し、それを使用してトランザクションを実行します。

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

1. セッションの `execute` オペレーション内で、`startTransaction` を呼び出すことで、トランザクションの開始を試行します。
   + セッションが有効でない場合は、`startTransaction` の呼び出しが失敗し、ドライバーはステップ 1 に戻ります。
   + `startTransaction` の呼び出しが成功すると、ドライバーは次のステップに進みます。

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

1. トランザクションのコミットの結果は、次に示す 2 つのいずれかになります。
   + コミットが成功し、ドライバーは制御をアプリケーションコードに返します。
   + オプティミスティック同時実行制御 (OCC) の競合により、コミットが失敗します。この場合、ドライバーは同じセッションを使用して手順 4 ～ 6 を再試行します。再試行の最大数は、アプリケーションコードで設定可能です。デフォルトの制限数は `4` です。

**注記**  
ステップ 4 ～ 6 の間に `InvalidSessionException` がスローされた場合、ドライバーはセッションを閉じたものとしてマークし、ステップ 1 に戻ってトランザクションを再試行します。  
手順 4 ～ 6 で他の例外がスローされた場合、ドライバーは、例外が発生した状態で再試行可能かどうかをチェックします。可能な場合は、指定された再試行回数までトランザクションを再試行します。可能でない場合は、アプリケーションコードに例外を伝播 (バブルアップしてスロー) します。

### セッションをプールに戻す
<a name="driver-session-mgmt.pooling-return"></a>

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