

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon QLDB 中使用驅動程式了解工作階段管理
<a name="driver-session-management"></a>

**重要**  
支援終止通知：現有客戶將可以使用 Amazon QLDB，直到 07/31/2025 的支援結束為止。如需詳細資訊，請參閱[將 Amazon QLDB Ledger 遷移至 Amazon Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

如果您有使用關聯式資料庫管理系統 (RDBMS) 的經驗，您可能熟悉並行連線。QLDB 沒有傳統 RDBMS 連線的相同概念，因為交易是使用 HTTP 請求和回應訊息執行。

在 QLDB 中，類似概念是*作用中工作階段*。工作階段在概念上類似於使用者登入，它會管理對分類帳提出之資料交易請求的相關資訊。作用中工作階段是主動執行交易的工作階段。它也可以是最近完成交易的工作階段，服務預期它會立即開始另一筆交易。QLDB 支援每個工作階段一個主動執行的交易。

每個分類帳的並行作用中工作階段限制定義於 中[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. `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 使用此遞交摘要來確保交易完整性。我們建議您使用 QLDB 驅動程式，而不是直接與此 API 互動。

驅動程式在交易資料 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 1.1.0](https://github.com/awslabs/amazon-qldb-driver-java/releases/tag/v1.1.0) 版） 中，我們提供驅動程式物件的兩個實作：標準、非合併`QldbDriver`和 `PooledQldbDriver`。顧名思義， `PooledQldbDriver`會維護在交易間重複使用的工作階段集區。

根據使用者意見回饋，開發人員偏好預設取得集區功能及其優點，而不是使用標準驅動程式。因此，我們移除 並將工作階段集區功能`PooledQldbDriver`移至 `QldbDriver`。此變更包含在每個驅動程式的最新版本中 （例如 [Java v2.0.0)。](https://github.com/awslabs/amazon-qldb-driver-java/releases/tag/v2.0.0)

驅動程式提供三種抽象層級：
+ **驅動程式** （混合驅動程式實作） – 最上層抽象。驅動程式會維護和管理工作階段集區。當您要求驅動程式執行交易時，驅動程式會從集區中選擇工作階段，並使用它來執行交易。如果交易因為工作階段錯誤 (`InvalidSessionException`) 失敗，驅動程式會使用另一個工作階段重試交易。基本上，驅動程式提供完全受管的工作階段體驗。
+ **工作階段** – 驅動程式抽象下方的一個層級。工作階段包含在集區中，驅動程式會管理工作階段的生命週期。如果交易失敗，驅動程式會使用相同的工作階段重試最多指定的嘗試次數。但是，如果工作階段遇到錯誤 (`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 陳述式的呼叫。在 lambda 表達式完成執行而沒有任何錯誤之後，驅動程式會繼續遞交交易。

1. 交易的遞交可以有兩個結果之一：
   + 遞交成功，而驅動程式會將控制項傳回至您的應用程式程式碼。
   + 由於樂觀並行控制 (OCC) 衝突，遞交失敗。在此情況下，驅動程式會使用相同的工作階段重試步驟 4–6。您可以在應用程式程式碼中設定重試嘗試次數上限。預設限制為 `4`。

**注意**  
如果在步驟 4–6 期間擲出 `InvalidSessionException` ，驅動程式會將工作階段標記為關閉，並返回步驟 1 重試交易。  
如果在步驟 4–6 期間擲出任何其他例外狀況，驅動程式會檢查是否可以重試例外狀況。若是如此，它會重試交易，直到指定的重試次數為止。如果沒有，它會將例外狀況傳播 （產生氣泡並擲回） 到您的應用程式程式碼。

### 將工作階段傳回至集區
<a name="driver-session-mgmt.pooling-return"></a>

如果在作用中交易過程中的任何時候`InvalidSessionException`發生 ，驅動程式不會將工作階段傳回至集區。QLDB 會改為捨棄工作階段，而驅動程式會從集區取得另一個工作階段。在所有其他情況下，驅動程式會將工作階段傳回至集區。