暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB-X Glue 连接

PolarDB 2025-12-11
37

PolarDB-X Glue 连接 (Connection)

XConnection
 类提供了一个线程安全的 (thread-safe)、JDBC 兼容的 (JDBC-compatible) 封装层 (wrapper) 来包裹 XSession
,它是使用 PolarDB-X Glue 的应用程序的主要连接接口 (connection interface)。它实现了标准的 JDBC Connection
 接口
 ,同时利用了底层
会话 (session)
 和网络层 (network layers) 增强的异步能力 (asynchronous capabilities) 。

本文涵盖了连接管理 (connection management)、线程安全机制 (thread safety mechanisms) 和 JDBC 兼容性 (JDBC compatibility) 的实现细节 (implementation details)。有关底层会话管理 (session management) 的信息,请参阅 会话管理 (Session Management) 章节。有关语句执行 (statement execution) 的详细信息,请参阅 语句 (Statements) 章节。

架构概览 (Architecture Overview)

XConnection
 充当一个门面 (facade) 角色,它提供 JDBC 兼容性 (JDBC compatibility),同时将实际的数据库操作委托给底层的 XSession
。该设计通过
读写锁 (read-write locks)
 确保了线程安全 (thread safety) ,并管理了从初始化到清理的完整生命周期 (lifecycle) 。

XConnection 结构 (XConnection Structure)


来源: src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 63-92

线程安全模型 (Thread Safety Model)

XConnection
 通过一个 ReentrantReadWriteLock
 确保线程安全 (thread safety),该锁用于保护对底层 XSession
 的访问。这种
加锁策略 (locking strategy)
 允许同时进行多个并发读取操作 (concurrent read operations),同时确保对写入操作 (write operations) 的独占访问 (exclusive access) 。

加锁策略 (Locking Strategy)

操作类型 (Operation Type)
锁类型 (Lock Type)
示例 (Examples)
查询执行 (Query Execution)
读锁 (Read Lock)
execQuery()
, execUpdate()
, getTSO()
会话状态变更 (Session State Changes)
读锁 (Read Lock)
setAutoCommit()
, setSessionVariables()
连接生命周期 (Connection Lifecycle)
写锁 (Write Lock)
close()
会话访问 (Session Access)
读锁 (Read Lock)
getSession()
, cancel()


来源: src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 65src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 115-121src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 320-326

生命周期管理 (Lifecycle Management)

初始化 (Initialization)

连接的生命周期 (lifecycle) 始于会话分配 (session assignment),经过初始化 (initialization) 后才能投入使用。init()
 方法确保会话 (session) 被正确配置,并启用自动提交 (autocommit enabled) 和连接 ID 获取 (connection ID retrieved) 。


来源: src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 87-92src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 94-112

连接清理 (Connection Cleanup)

close()
 方法实现了全面清理逻辑 (comprehensive cleanup logic),确保事务安全 (transaction safety) 和适当的**资源管理 (resource management)**:

  1. 事务回滚 (Transaction Rollback) :自动回滚所有未提交的事务 (uncommitted transactions)
  2. 请求验证 (Request Validation) :检查是否存在未完成的请求 (incomplete requests) ,并在必要时强制清理
  3. 会话返回 (Session Return) :将会话返回给连接池 (pool),如果复用 (reuse) 失败则丢弃
  4. 资源置空 (Resource Nullification) :将会话引用 (session reference) 设置为 null 以防止后续使用

来源: src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 124-174

JDBC 接口实现 (JDBC Interface Implementation)

XConnection
 实现了标准的 JDBC Connection
 接口
,为现有基于 JDBC 的应用 (JDBC-based applications) 提供兼容性 (compatibility) ,同时利用了 PolarDB-X 协议 (PolarDB-X protocol) 增强的能力。

核心 JDBC 方法 (Core JDBC Methods)

JDBC 方法 (JDBC Method)
实现 (Implementation)
委托目标 (Delegation Target)
createStatement()
返回 XStatement
新的语句封装器 (New statement wrapper)
prepareStatement(sql)
返回 XPreparedStatement
新的预处理语句封装器 (New prepared statement wrapper)
setAutoCommit(autoCommit)
更新会话状态
session.setAutoCommit()
commit()
执行提交 SQL
execUpdate("commit")
rollback()
执行回滚 SQL
execUpdate("rollback")
getAutoCommit()
返回缓存值
本地 autoCommit
 字段 (Local autoCommit
 field)
isClosed()
检查会话状态
session == null

不支持的操作 (Unsupported Operations)

由于不适用于 **PolarDB-X 架构 (PolarDB-X architecture)**,一些 JDBC 方法 (JDBC methods) 会抛出 NotSupportException
( 不支持异常 (NotSupportException) ):

  • 数据库元数据操作 (Database metadata operations) (getMetaData()
    )
  • 目录 (Catalog) 和模式管理 (schema management) (setCatalog()
    , setSchema()
    )
  • 高级结果集配置 (Advanced result set configurations)
  • 保存点操作 (Savepoint operations)
  • CLOB
    /BLOB
     创建

来源: src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 701-708src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 725-743

查询执行方法 (Query Execution Methods)

XConnection
 提供了多个重载方法 (overloaded methods) 用于执行查询 (executing queries) 和更新 (updates),支持各种参数绑定策略 (parameter binding strategies) 和执行模式 (execution modes) 。

查询执行流程 (Query Execution Flow)


方法变体 (Method Variants)

方法模式 (Method Pattern)
目的 (Purpose)
示例 (Example)
execQuery(String sql)
简单 SQL 执行 (Simple SQL execution)
基本 SELECT 语句 (Basic SELECT statements)
execQuery(String sql, List<PolarxDatatypes.Any> args)
参数化查询 (Parameterized queries)
预处理语句风格的执行 (Prepared statement-style execution)
execQuery(BytesSql sql, byte[] hint, ...)
带提示的高级执行 (Advanced execution with hints)
带有执行提示的优化查询 (Optimized queries with execution hints)
execGalaxyPrepare(...)
Galaxy Prepare 优化 (Galaxy Prepare optimization)
高性能预处理语句 (High-performance prepared statements)

来源: src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 309-393src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 395-469

高级特性 (Advanced Features)

连接模式与能力 (Connection Modes and Capabilities)

XConnection
 支持多种操作模式 (operational modes),这些模式会影响查询执行行为 (query execution behavior) :


Galaxy Prepare 支持 (Galaxy Prepare Support)

连接通过 execGalaxyPrepare()
 方法支持 Galaxy Prepare 优化 (Galaxy Prepare optimization) ,该方法为预处理语句执行 (prepared statement execution) 提供了增强性能 (enhanced performance) :


来源: src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 383-393src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 190-228

物理回填操作 (Physical Backfill Operations)

XConnection
 为数据迁移 (data migration) 和表结构重组 (table restructuring) 中使用的物理回填操作 (physical backfill operations) 提供了专门方法 (specialized methods) :

  • execTransferFile()
     - 传输文件数据操作 (Transfer file data operations)
  • execReadBufferFromFile()
     - 从源文件读取操作 (Read operations from source files)
  • execCheckFileExistence()
     - 文件存在性验证 (File existence verification)
  • exeCloneFile()
     - 文件克隆操作 (File cloning operations)
  • execDeleteTempIbdFile()
     - 临时文件清理 (Temporary file cleanup)

来源: src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 1030-1108

配置与性能 (Configuration and Performance)

网络超时管理 (Network Timeout Management)

连接通过 JDBC 标准接口 (JDBC standard interface) 支持可配置的网络超时 (configurable network timeouts),同时在内部提供纳秒精度 (nanosecond precision) :

方法 (Method)
目的 (Purpose)
精度 (Precision)
setNetworkTimeout(executor, milliseconds)
标准 JDBC 超时 (JDBC timeout)
毫秒 (Milliseconds)
setNetworkTimeoutNanos(nanos)
内部高精度超时 (Internal high-precision timeout)
纳秒 (Nanoseconds)
actualTimeoutNanos()
解析后的超时值 (Resolved timeout value)纳秒 (Nanoseconds),带默认回退 (default fallback)

性能跟踪 (Performance Tracking)

XConnection
 跟踪连接创建 (connection creation) 和等待时间 (wait times) 以进行性能监控 (performance monitoring) :

  • connectNano
     - 建立连接 (establishing the connection) 所花费的时间
  • waitNano
     - 等待连接可用性 (waiting for connection availability) 所花费的时间
  • traceId
     - 用于分布式跟踪 (distributed tracing) 的请求跟踪标识符 (Request tracing identifier)

来源: src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 1111-1123src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 695-698src/main/java/com/alibaba/polardbx/rpc/pool/XConnection.java
 78-82

附录: 并发读写大事务场景中 XConnection
 的读写锁 (Read-Write Lock) 机制对性能的影响

鉴于 XConnection
 实现了 JDBC 兼容性 (JDBC compatibility),并声称具有线程安全 (thread safety) 和**增强性能 (enhanced performance)**(如 Galaxy Prepare 优化),我们知道其核心机制是使用 ReentrantReadWriteLock
 来保护底层 XSession
 。

我的问题是:

在并发高、且读写混合的 OLTP 场景中,XConnection
 的读写锁 (Read-Write Lock) 机制对性能的影响如何?具体来说,当大量事务同时执行 execUpdate()
 或 execQuery()
 等操作时:

  1. 读操作(Read Lock):是否会在高并发下,因为锁竞争而导致吞吐量下降?XConnection
     如何确保在保证线程安全的前提下,最大化并发读取操作 (concurrent read operations) 的效率?
  2. 写操作(Write Lock):close()
     方法需要获取写锁 (Write Lock),那么连接池(Pool)中,频繁的连接归还和获取操作(涉及到 close()
     及其清理逻辑)是否会成为系统整体性能的瓶颈 (bottleneck) ?

这个问题旨在从理论实现深入到实际运行时的效率和潜在瓶颈,对于评估 PolarDB-X Glue 在生产环境中的适用性具有高价值。


问题聚焦于 XConnection
 在高并发 OLTP 场景下的读写锁性能影响。让我基于代码实现来分析这两个关键问题。

核心机制概述

XConnection
 使用 ReentrantReadWriteLock
 保护底层 XSession
  。所有查询和更新操作都需要获取读锁,而 close()
 操作需要获取写锁  。

1. 读操作的并发性能

读锁的实际影响

在高并发场景下,读锁不会成为主要瓶颈,原因如下:

多个读操作可以并发执行。ReentrantReadWriteLock
 允许多个线程同时持有读锁,因此 execQuery()
 和 execUpdate()
 可以并发执行  。每个操作的锁持有时间极短,仅包含:

  • 调用 check()
     验证连接状态
  • 委托给 session.execQuery()
     或 session.execUpdate()
  • 立即释放锁

真正的执行在锁外进行。锁只保护会话状态检查和请求提交,实际的网络 I/O 和结果处理都在 XSession
 内部异步完成,不持有 XConnection
 的锁  。

并发读取效率保证

XConnection
 通过以下机制最大化并发读取效率:

  1. 最小化临界区: 读锁仅保护状态检查,不包含实际执行逻辑
  2. 异步处理: XSession
     内部使用异步 I/O 和流水线执行,避免阻塞
  3. 无锁升级: 读操作永远不会升级为写锁,避免死锁风险

2. 写操作的瓶颈分析

close()
 的写锁影响

close()
 方法确实需要获取写锁,这会阻塞所有并发的读操作  。但在实际场景中,这不会成为系统瓶颈:

连接复用减少 close 频率。PolarDB-X Glue 的架构设计中,XConnection.close()
 不会真正关闭底层 TCP 连接,而是将 XSession
 归还到连接池  。连接池会复用这些会话,大幅减少 close()
 调用频率。

close 操作的实际耗时。close()
 方法的主要工作包括:

  • 回滚未提交事务 (如果非自动提交模式)
  • 刷新可忽略的请求
  • 检查并归还会话到池中

这些操作虽然需要写锁,但执行时间相对较短。

连接池归还的设计优化

连接池的设计避免了频繁获取/归还成为瓶颈:

  1. 会话级别池化: 每个 XClient
     (TCP 连接) 维护自己的会话池,减少全局锁竞争
  2. 快速路径: reuseSession()
     方法会快速判断会话是否可复用,避免不必要的清理操作
  3. 异步清理: 会话清理和健康检查在后台线程中进行,不阻塞应用线程

性能评估结论

在高并发 OLTP 场景中:

读锁不是瓶颈。多个事务可以并发执行 execQuery()
 和 execUpdate()
,锁持有时间极短 (微秒级),且真正的执行在锁外异步进行 。

写锁影响有限。close()
 操作频率低 (得益于连接池复用),且执行时间短。即使在连接频繁归还的场景下,写锁的阻塞时间也远小于实际的 SQL 执行时间 。

真正的性能瓶颈在于:

  • 网络 I/O 延迟
  • 数据库引擎的查询处理能力
  • XSession
     内部的同步操作 (如 execUpdate
     方法使用 synchronized
    )

Notes

XConnection
 的读写锁设计是轻量级的,主要用于保护连接状态的一致性,而非控制并发执行。实际的并发控制和性能优化发生在更底层的 XSession
 和网络层。如果您关注极端高并发场景的性能,建议关注 XSession
 内部的 synchronized
 方法和连接池的配置参数 (如最大连接数、会话池大小等) 。


文章转载自PolarDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论