首批通过分布式安全可靠测评,为关键业务系统打造
Prepare+Execute 二合一协议介绍
更新时间:2026-03-13 06:11
二合一协议简单来说就是 prepare 协议 + execute 协议的结合,将两个协议融合成了同一个协议,使用同一个命令字发送过来的协议。
适用版本
OceanBase 数据库所有版本。
SQL 语句协议
执行一条 SQL 语句的协议分为两大类:文本协议和 PS 协议。
文本协议:文本协议是一种基于文本的协议,用于在客户端和服务器之间传输 SQL 查询和结果。直白来说,就是执行什么语句传输什么语句的文本,不会有参数绑定等操作。
PS 协议:是二进制协议中的一种,叫做预处理协议,用于支持预处理语句(Prepared Statement),客户端可以将参数绑定到查询语句中。它包括客户端发送参数绑定请求报文、服务器返回参数绑定结果报文等步骤。
广义上来讲,PS 协议包含了普通的 PS 协议(prepare + execute)和二合一协议,这两种协议是 PS 协议在 OceanBase 数据库中的两种不同的实现方式。
二合一协议是 PS 协议的另一种形式,也会做预处理语句,绑定参数,唯一的区别是,二合一协议的 prepare 和 execute 是放在一个协议包中执行的。
什么情况下会走到二合一协议
OBCI 默认走二合一协议,只有设置了 export ENABLE_PREPARE_EXECUTE=0 才会不走二合一协议。
OCCI 默认走二合一协议,只有设置了 export ENABLE_PREPARE_EXECUTE=0 才会不走二合一协议。
JDBC 链接串设置,满足以下两个任意条件都会开启二合一协议:
useServerPrepStmts=true&usePieceData=true(usePieceData=true 在 MySQL 租户无效,因为 MySQL 模式没有 PS 二合一协议)。
useOraclePrepareExecute=true(仅限 Oracle 租户)。
如何判断当前问题是否走了二合一协议
首先可以参考上文中的设置,满足了 3 中的设置就可能走二合一协议。
对于报错的语句,server 日志里如果有 obmp_stmt_prexecute 文件相关的日志,可以确定走了二合一协议。
二合一协议与 ps cursor 的关系
ps cursor:ps 协议下的查询语句,可以通过 cursor 对结果集进行缓存,然后用 fetch 协议批量获取,避免把结果集一次性传递给驱动,导致驱动的 OOM。
目前,二合一协议下,所有 select 语句都会默认走 ps cursor。所以当一个查询语句在 二合一协议下出现执行慢等问题,可以考虑一下 ps cursor 的因素。