影响 OceanBase 数据库连接超时的相关配置

影响 OceanBase 数据库连接超时的相关配置

本文介绍 OceanBase 数据库中,和 OBServer 超时、OBProxy 超时以及应用使用 JDBC 超时的相关配置。
在 OceanBase 数据库生产环境中,在排除了网络防火墙的连接超时外,还会存在以下三种连接超时的情况:

  • OBServer 超时
  • OBProxy 超时
  • 应用使用 JDBC 超时

本文主要介绍影响以上三种情况的参数配置。

OBServer 超时

影响 OBServer 超时的参数有 ob_query_timeout 和 ob_trx_timeout。

  • ob_query_timeout 是一个会话级变量,表示 OBServer 执行一条 SQL 语句的超时时间。当 SQL 在OBServer 端执行时间超过 ob_query_timeout 时,OBServer 会返回一个 ERROR 包给客户端,错误码为 4012。

该参数默认为 10000000,单位是微秒,即 10 秒。可以通过以下几种方式设置:

  • ob_trx_timeout 是 OceanBase 数据库内部的事务超时时间,也是一个会话级变量,当一个事务执行超过ob_trx_timeout 还没有结束时,OBServer 也会返回一个 Error 包给客户端,错误码是 4012。
    -- 如果超时发生时,事务还没有提交,则 OBServer 会回滚该事务。
    -- 如果发生在提交阶段,由于事务状态未定,OBServer 不会主动回滚。

ob_trx_timeout 默认为 100000000,单位是微秒,即 100 秒,可以通过以下方式设置。

SET @@ob_trx_timeout = 100000000;或SET @@global.ob_trx_timeout = 100000000;

有关以上配置项的详细信息,参见《OceanBase 数据库 参考指南》中的 系统 配置项 章节。

OBProxy 超时

影响 OBProxy 超时的参数有 ob_query_timeout 和 observer_query_timeout_delta。

  • ob_query_timeout 表示从 OBProxy 把业务 SQL 转发给选出的 OBServer 到接收来自 OBServer 反馈的等待超时时间。

业务的 SQL 通过 OBProxy 进行转发,如果 SQL 执行超过了业务设置的 ob_query_timeout,依然没有收到来自 OBServer 的反馈时,OBProxy 会断开与业务的连接,同时断开与 OBServer 的连接。OBProxy 确认超时的方式有 2 种:
-- 通过 session 变量 ob_query_timeout。
-- 根据用户在 SQL Hint 中添加的 query_timeout。

如果 2 种方式同时存在,以业务的 SQL Hint 为准。

  • observer_query_timeout_delta:考虑到 OBProxy 与 OBServer 之间的网络 RT(Response Time,响应时间),OBProxy 内部的超时时间会在 ob_query_timeout 基础上加上 observer_query_timeout_delta 时间,默认为 20s,即 timeout = ob_query_timeout + observer_query_timeout_delta。

observer_query_timeout_delta 可以使用 OBProxy 的 MetaDB 账户连接 OBProxy,然后使用 ALTER PROXYCONFIG 命令修改配置项。

obclient  -P2883 -uroot@proxysys  -A  -hXXX -pXXXALTER PROXYCONFIG SET observer_query_timeout_delta=20s

observer_query_timeout_delta 参数设置后立即生效,取值范围为 1~30,单位为秒。

应用使用 JDBC 超时

影响应用使用 JDBC 超时的参数主要有 socketTimeout、connectTimeout 与 queryTimeout 。

socketTimeout 是 socket 的超时时间,指的是业务的 APP 与后台 OBServer 或 OBProxy 之间进行 TCP 通信的网络超时时间,如果业务 APP 超过 socketTimeout 的时间还没有从 OBServer 或 OBProxy 收到反馈,JDBC 会发生网络异常,进而关闭该连接。

socketTimeout 单位是毫秒,可以通过以下方式设置。

jdbc:mysql://$ip:$port/$database?socketTimeout=60000

connectTimeout 是业务 APP 使用 JDBC 与后台 OBServer 或 OBProxy 建立 TCP 连接的超时时间,如果 TCP 连接超过这个时间没有创建成功,JDBC 会发生网络异常,进而关闭该连接。

connectTimeout 的单位是毫秒,可以通过以下方式设置。

jdbc:mysql://$ip:$port/$database?socketTimeout=60000&connecTimeout=5000

queryTimeout 是业务 APP 执行 SQL 语句时,JDBC 本地的超时时间。对于超过 queryTimeout 仍没有执行结束的 SQL,JDBC 会在当前连接上给 OBServer 或 OBProxy 发送一个停止查询的请求,并给上层业务返回一个 MySQLTimeoutException。

queryTimeout 单位是秒,可以通过以下方式进行设置。

int queryTimeout = 10;java.sql.Statement stmt = connection.CreateStatement();stmt.setQueryTimeout(queryTimeout)
posted @ 2026-05-11 14:45  数据库小白(专注)  阅读(13)  评论(0)    收藏  举报