

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon QLDB 驱动程序中的常见错误
常见错误

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

本节描述了 Amazon QLDB 驱动程序在与[ QLDB 会话 API](https://docs.aws.amazon.com/qldb/latest/developerguide/API_Types_Amazon_QLDB_Session.html) 交互时可能引发的运行时错误。

下面是驱动程序返回的常见异常列表。每个异常都包括特定的错误消息，然后是简短的描述和可能的解决方案建议。<a name="driver-errors.varlist"></a>

**CapacityExceededException**  
消息：容量已超出  
Amazon QLDB 拒绝了该请求，因为它超出了分类账的处理能力。QLDB 对每个分类账强制执行内部扩展限制，以维护服务的运行状况和性能。此限制因每个请求的工作负载大小而异。例如，如果请求执行效率低下的数据事务，例如由非索引限定查询产生的表扫描，则该请求的工作负载可能会增加。  
我们建议您在重试请求之前等待。如果您的应用程序一直遇到此异常，请优化您的语句并降低发送到分类账的请求的速率和数量。语句优化的示例包括每个事务运行更少的语句和调优表索引。要了解如何优化语句和避免表扫描，请参阅 [优化查询性能](working.optimize.md)。  
建议使用最新版本的 QLDB 驱动程序。驱动程序具有默认的重试策略，该策略使用[指数回退和抖动](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)来自动重试此类异常。指数回退的原理是对于连续错误响应，重试等待间隔越来越长。

**InvalidSessionException**  
消息：交易*transactionId*已过期  
事务已超过其最长生命周期。在提交之前，事务最多可运行 30 秒。超过此时间限制后，QLDB 会拒绝在事务完成的任何工作，并丢弃运行该事务会话。此限制通过启动事务（而不提交或取消事务）以保护客户端免遭泄漏会话。  
如果这是应用程序中常见的异常，那么很可能是事务运行时间过长。如果事务运行时间超过 30 秒，请优化您的语句以加快事务速度。语句优化的示例包括每个事务运行更少的语句和调优表索引。有关更多信息，请参阅 [优化查询性能](working.optimize.md)。

**InvalidSessionException**  
消息：会话*sessionId*已过期  
QLDB 放弃了会话，因为它已超过其最大总生命周期。无论事务是否处于活动状态，QLDB 都会在 13-17 分钟后丢弃会话。会话丢失或受损的原因有很多，如硬件故障、网络故障或应用程序重启。因此，QLDB 对会话强制使用最长生命周期，以确保客户端软件能应对会话故障。  
如果您遇到此异常，我们建议您获取一个新的会话并重试该事务。我们还建议使用最新版本的 QLDB 驱动程序，该驱动程序代表应用程序管理会话池及其运行状况。

**InvalidSessionException**  
消息：没有这样的会话  
客户试图使用不存在的会话与 QLDB 进行事务处理。假设客户端正在使用先前存在的会话，则由于以下原因之一，该会话可能不再存在：  
+ 如果会话涉及内部服务器故障（即 HTTP 响应代码 500 错误），那么 QLDB 可能会选择完全放弃该会话，而不是允许客户使用状态不确定的会话进行事务。然后，对该会话的任何重试尝试都会失败，并出现此错误。
+ 过期的会话最终会被 QLDB 遗忘。然后，任何继续使用会话的尝试都会导致此错误，而不是初始 `InvalidSessionException`。
如果您遇到此异常，我们建议您获取一个新的会话并重试该事务。我们还建议使用最新版本的 QLDB 驱动程序，该驱动程序代表应用程序管理会话池及其运行状况。

**RateExceededException**  
消息：已超出速率  
QLDB 根据调用者的标识对客户端进行节流。QLDB 使用[令牌桶](https://en.wikipedia.org/wiki/Token_bucket)节流算法在每个区域、每个账户的基础上强制执行节流。QLDB 这样做是为了帮助提高服务的性能，并确保所有 QLDB 客户的公平使用。例如，尝试使用 `StartSessionRequest` 操作获取大量并发会话可能会导致节流。  
为了保持应用程序的运行状况并缓解进一步的节流，您可以使用[指数回退](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)和抖动来重试此异常。指数回退的原理是对于连续错误响应，重试等待间隔越来越长。建议使用最新版本的 QLDB 驱动程序。驱动程序具有默认的重试策略，该策略使用指数回退和抖动来自动重试此类异常。  
如果您的应用程序持续受到 QLDB 的 `StartSessionRequest` 调用节流，那么最新版本的 QLDB 驱动程序也可以提供帮助。驱动程序维护着一个跨事务重复使用的会话池，这有助于减少应用程序发出的 `StartSessionRequest` 调用次数。要请求提高 API 节流限额，请联系 [AWS 支持 中心](https://console.aws.amazon.com/support/home#/)。

**LimitExceededException**  
消息：已超出会话限制  
分类账的活跃会话数量超过了其配额（也称为*限制*）。此配额在 [Amazon QLDB 资源中的限额和限制](limits.md) 中定义。分类账的活动会话计数最终是一致的，并且始终在配额附近运行的分类账可能会定期看到此异常。  
为了保持应用程序的运行状况，我们建议重试此异常。为避免出现这种异常，请确保在所有客户端上为单个分类账配置的并发会话不超过 1,500 个。例如，您可以使用适用于 Java 的 [Amazon QLDB 驱动程序的[maxConcurrentTransactions](https://github.com/awslabs/amazon-qldb-driver-java/blob/master/src/main/java/software/amazon/qldb/QldbDriverBuilder.java#L125)](https://github.com/awslabs/amazon-qldb-driver-java/)方法来配置驱动程序实例中的最大可用会话数。

**QldbClientException**  
消息：流结果仅在父事务打开时有效  
事务已关闭，无法用于从 QLDB 检索结果。事务在提交或取消时关闭。  
当客户端直接处理 `Transaction` 对象，并且在提交或取消事务后尝试从 QLDB 检索结果时，就会发生此异常。为了缓解此问题，客户端必须在关闭事务之前读取数据。