You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

配置HikariCP与OceanBase(OBProxy)避免失效连接及Connection reset错误最佳实践

OceanBase + OBProxy + HikariCP 连接池调优问题解答

1. OBProxy对wait_timeout/interactive_timeout的处理差异及对齐要求

OBProxy与原生MySQL的核心差异在于:它自身维护独立的客户端连接超时机制(通过参数client_idle_timeout控制,默认值通常为900秒/15分钟),这个参数优先级高于OceanBase节点的wait_timeout/interactive_timeout

应用通过JDBC设置的wait_timeout/interactive_timeout会传递给后端OceanBase节点,但OBProxy会在客户端连接空闲超过自身client_idle_timeout后主动断开连接,不会等待OceanBase节点的超时触发。

必须显式对齐:HikariCP的maxLifetime必须设置为小于OBProxy的client_idle_timeout,建议比后者小30-60秒(比如OBProxy超时15分钟时,maxLifetime设为840秒/14分钟),避免连接被OBProxy断开后仍留在连接池中,导致借用时出现重置错误。

2. 是否需要启用HikariCP的keepaliveTime

强烈建议启用

即使OBProxy和HikariCP的超时设置对齐,中间网络设备(防火墙、负载均衡器)仍可能主动断开长时间空闲的TCP连接。HikariCP的keepaliveTime会定期对空闲连接发起轻量心跳(配合connectionTestQuery),保持连接活跃,避免被中间设备强制断开。

注意:keepaliveTime必须同时小于maxLifetime和OBProxy的client_idle_timeout

3. 生产验证的连接池配置及架构建议

推荐的Spring Boot HikariCP配置(application.yml)

spring:
  datasource:
    url: jdbc:oceanbase://${OB_PROXY_HOST}:${OB_PROXY_PORT}/${DB_NAME}?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
    driver-class-name: com.oceanbase.jdbc.Driver
    hikari:
      # 连接池最大连接数,根据业务并发量调整
      maximum-pool-size: 20
      # 最小空闲连接数,避免低峰后突增流量时重建连接
      minimum-idle: 5
      # 连接最大生命周期,需小于OBProxy的client_idle_timeout(示例为14分钟)
      max-lifetime: 840000
      # 空闲连接心跳间隔,示例为5分钟
      keepalive-time: 300000
      # 连接超时时间
      connection-timeout: 30000
      # 连接验证超时时间
      validation-timeout: 5000
      # 轻量验证查询,OBProxy可识别/* ping */注解直接返回,无需真正执行SQL
      connection-test-query: /* ping */ SELECT 1
      # 空闲连接回收超时,需大于keepalive-time
      idle-timeout: 600000

架构及运维建议

  • 统一OBProxy配置:确保所有OBProxy节点的client_idle_timeout配置一致,避免因节点差异导致连接断开行为不稳定。
  • 优先使用OceanBase官方JDBC驱动com.oceanbase.jdbc.Driver(obclient依赖)比MySQL驱动更适配OceanBase分布式特性,支持/* ping */等高效心跳命令。
  • 监控关键指标:跟踪HikariCP的activeConnections/idleConnections/connectionAcquireTime,以及OBProxy的连接断开日志,快速定位异常。
  • 低峰时段优化:若低峰时段空闲连接过多,可通过idle-timeout自动回收闲置连接,但需保证其值大于keepalive-time,避免心跳未触发就被回收。

内容的提问来源于stack exchange,提问作者cui xiao

火山引擎 最新活动