本文介绍 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 秒。可以通过以下几种方式设置。
示例,设置事务超时时间为 864000000 微秒,即 864 秒。
Session 生效。
SET ob_query_timeout =864000000;Global 生效。
SET GLOBAL ob_query_timeout =864000000;
ob_trx_timeout是 OceanBase 数据库内部的事务超时时间,也是一个会话级变量,当一个事务执行超过ob_trx_timeout还没有结束时,OBServer 也会返回一个 Error 包给客户端,错误码是 4012。如果超时发生时,事务还没有提交,则 OBServer 会回滚该事务。
如果发生在提交阶段,由于事务状态未定,OBServer 不会主动回滚。
ob_trx_timeout默认为 100000000,单位是微秒,即 10 秒,可以通过以下方式设置。示例,设置事务超时时间为 864000000 微秒,即 864 秒。
Session 生效。
SET ob_trx_timeout =864000000;Global 生效。
SET GLOBAL ob_trx_timeout =864000000;
有关以上配置项的详细信息,参见《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 -pXXX ALTER PROXYCONFIG SET observer_query_timeout_delta=20sobserver_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=60000connectTimeout是业务 APP 使用 JDBC 与后台 OBServer 或 OBProxy 建立 TCP 连接的超时时间,如果 TCP 连接超过这个时间没有创建成功,JDBC 会发生网络异常,进而关闭该连接。connectTimeout的单位是毫秒,可以通过以下方式设置。jdbc:mysql://$ip:$port/$database?socketTimeout=60000&connectTimeout=5000queryTimeout是业务 APP 执行 SQL 语句时,JDBC 本地的超时时间。对于超过queryTimeout仍没有执行结束的 SQL,JDBC 会在当前连接上给 OBServer 或 OBProxy 发送一个停止查询的请求,并给上层业务返回一个MySQLTimeoutException。queryTimeout单位是秒,可以通过以下方式进行设置。int queryTimeout = 10;java.sql.Statement stmt = connection.CreateStatement();stmt.setQueryTimeout(queryTimeout)
说明
一般不建议配置 queryTimeout。如果要使用 queryTimeout,建议设置一个比 socketTimeout 小的值,否则会先触发网络超时从而导致断开连接