本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Amazon QLDB 中通过驱动程序了解会话管理
重要
终止支持通知:现有客户将能够使用 Amazon QLDB,直到 2025 年 7 月 31 日终止支持。有关更多详细信息,请参阅将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL
如您有使用关系数据库管理系统(RDBMS)的经验,可能已熟悉并发连接。QLDB 与传统 RDBMS 连接的概念不同,因为事务通过 HTTP 请求和响应消息运行。
在 QLDB 中,类比概念是活跃会话。从概念上讲,会话类似于用户登录,它管理有关您对分类账的数据事务请求的信息。活动会话是指正在积极运行事务会话。它可以是最近完成事务的会话,服务预计它将立即启动另一笔事务。QLDB 支持每个会话正在运行的事务。
每个分类账的并发活动会话限制在Amazon QLDB 资源中的限额和限制中定义。达到此限制后,任何尝试启动事务的会话都会导致错误(LimitExceededException
)。
有关使用 QLDB 驱动程序在应用程序中配置会话池的最佳实践,请参阅Amazon QLDB 驱动程序建议中的配置 QldbDriver 对象。
会话生命周期
以下 QLDB 会话 API 操作序列代表了 QLDB 会话的典型生命周期:
-
StartSession
-
StartTransaction
-
ExecuteStatement
-
CommitTransaction
-
重复步骤 2—4 以启动更多事务(一次一个事务)。
-
EndSession
会话过期
无论会话是否在积极运行事务,QLDB 都会在总生命周期为13–17 分钟后过期并丢弃会话。会话丢失或受损的原因有很多,如硬件故障、网络故障或应用程序重启。QLDB 对会话强制使用最长生命周期,以确保客户端应用程序能应对会话故障。
QLDB 驱动程序中的会话处理
尽管您可以使用 S AWS DK 直接与 QLDB 会话 API 进行交互,但这会增加复杂性,需要您计算提交摘要。QLDB 使用此提交摘要确保事务完整性。我们建议不要直接与 API 交互,而是使用 QLDB 驱动程序。
该驱动程序在事务数据 API 中提供了高级抽象层。它通过SendCommand管理 API 调用,简化了在账本数据上运行 PartiQL 语句的过程。这些 API 调用需要驱动程序为您处理的多项参数,包括会话管理、事务管理以及出现错误时的重试策略。
会话池概述
在旧版本的 QLDB 驱动程序(例如 JavaQldbDriver
和 PooledQldbDriver
。顾名思义,PooledQldbDriver
维护着一个可在事务中重复使用的会话池。
根据用户反馈,开发人员更喜欢默认使用池化功能及其优势,而非使用标准驱动程序。因此,我们删除了PooledQldbDriver
并将会话池功能移至QldbDriver
。此更改包含在每个驱动程序的最新版本中(例如 Java v2.0.0
该驱动程序提供了三种抽象级别:
-
驱动程序(池化驱动程序实现)- 顶级抽象。驱动程序维护和管理会话池。当您要求驱动程序运行事务时,驱动程序会从池中选择会话并使用它来运行事务。如果事务由于会话错误(
InvalidSessionException
)而失败,则驱动程序将使用另一会话重试该事务。从本质上讲,该驱动程序提供了完全托管会话体验。 -
会话 - 比驱动程序抽象低一个级别。会话包含在池内,驱动程序管理会话的生命周期。如果事务失败,驱动程序会使用同一个会话、以最多指定次数重试该事务。但是,如果会话遇到错误(
InvalidSessionException
),QLDB 将在内部将其丢弃。然后,驱动程序负责从池中获取另一会话以重试该事务。 -
事务 - 最低的抽象级别。事务包含在会话中,会话则管理事务的生命周期。如果出现错误,会话负责重试事务。该会话还确保它不泄露尚未提交或取消的未完成事务。
在每个驱动程序的最新版本,您只能在驱动程序抽象级别执行操作。您无法直接控制单个会话和事务(也就是说,没有用于手动启动新会话或事务的 API 操作)。
会话池与事务逻辑
驱动程序的最新版本不再提供驱动程序对象的非池化实现。默认情况下,该 QldbDriver
对象管理会话池。当您调用运行事务时,驱动程序将执行以下步骤:
-
驱动程序检查其是否达到会话池限制。如果是,驱动程序会立即抛出
NoSessionAvailable
异常。否则,转到下一步。 -
驱动程序检查池中是否有可用会话。
-
如果池中存在可用会话,则驱动程序将使用该会话来运行事务。
-
如果池中没有可用会话,则驱动程序将创建新会话并使用该会话来运行事务。
-
-
在第 2 步中驱动程序获得会话后,驱动程序将在会话实例上调用该
execute
操作。 -
在会话的
execute
操作中,驱动程序尝试通过调用startTransaction
来启动事务。-
如果会话无效,则
startTransaction
调用失败,驱动程序将返回至步骤 1。 -
如果
startTransaction
调用成功,驱动程序将继续下一步。
-
-
驱动程序运行您的 lambda 表达式。此 lambda 表达式可包含一个或多个用于运行 PartiQL 语句的调用。在 lambda 表达式完成运行且没有任何错误后,驱动程序将继续提交事务。
-
事务的提交结果如下:
-
提交成功,驱动程序将控制权返回至您的应用程序代码。
-
因乐观并发控制(OCC)冲突,提交失败。在这种情况下,驱动程序使用相同会话重试步骤 4—6。最大重试次数可以在应用程序代码中配置。默认限制为
4
。
-
注意
如果InvalidSessionException
在步骤 4—6 期间抛出,则驱动程序会将会话标记为已关闭,然后返回步骤 1 重试事务。
如果在步骤 4—6 中引发任何其他异常,则驱动程序会检查是否可以重试该异常。如果是这样,它会重试此事务,直到达到指定的重试次数。否则,它会将异常传播(冒泡并抛出)至您的应用程序代码中。
将会话重返数据池
如果在活动事务过程中的任何时候发生InvalidSessionException
,则驱动程序不会将会话返回到池中。QLDB 改为丢弃会话,驱动程序会从池内获得另一个会话。在所有其它情况下,驱动程序会将会话返回池中。