问题现象
在压测期间,OceanBase 数据库出现大量 SHOW VARIABLES 类型的 SQL 请求,例如 SHOW GLOBAL VARIABLES、SHOW VARIABLES WHERE Variable_name = 'tx_isolation'、SHOW VARIABLES WHERE Variable_name = 'tx_read_only'),导致 CPU 使用率超过 50%。
关键信息
可通过 gv$ob_sql_audit 查询与指定 SQL_ID 相关的审计信息:
select sql_id,tenant_name,query_sql,count(*) from gv$ob_sql_audit where sql_id='xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' group by sql_id,tenant_name,query_sql order by 4 asc;
审计结果示意如下:

问题原因
JDBC 驱动版本过低:在 V2.4.12 版本中,
useLocalSessionState=TRUE未生效。该参数的作用是避免事务频繁向 OceanBase 数据库发送 session 变量查询 SQL。更多信息可参见数据库连接池配置。压测期间,每次执行单个事务前都会重新从连接池获取数据库连接,执行完成后再返还连接池。由于
useLocalSessionState未生效,session 状态变量只能通过 SQL 语句级别设置。存在
set autocommit=1开启自动提交的情况,导致压测中的 DML SQL 变成单语句事务,进一步增加了 session 状态变量设置次数。应用端程序本身存在问题。
问题的风险及影响
大量 SHOW VARIABLES SQL 会持续消耗 CPU 资源,导致 CPU 使用率过高。
适用版本
OceanBase 数据库 V4.2.x 版本。
解决方法
升级 JDBC 驱动至 V2.4.15 或更高版本,之后启用
useLocalSessionState参数以缓存 session 状态变量,减少与数据库的交互开销。调整应用端程序,重点排查连接池使用方式以及自动提交相关设置。