You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vert.x操作MSSQL插入报错求助:仅生产环境出现连接异常

问题描述

向MSSQL数据库执行INSERT操作时触发Vert.x相关异常,READ操作可正常执行:

  • Vert.x 4.4.0版本抛出io/vertx/sqlclient/ClosedConnectionException
  • Vert.x 4.3.8版本提示Fail to read any response from the server, the underlying connection might get lost unexpectedly

测试环境运行正常,仅生产环境出现该问题,已尝试以下方案但无效:

  • 将超时时间从3秒延长至5分钟
  • 创建新的数据库用户
  • 更换mssql-client版本

数据库连接池创建代码:

public static MSSQLPool createMssqlDbPool(Vertx vertx, DbConfig dbConfig) {

    MSSQLConnectOptions connectOptions = new MSSQLConnectOptions()
      .setHost(System.getenv().getOrDefault("DB_HOST", dbConfig.getHost()))
      .setPort(Integer.parseInt(System.getenv().getOrDefault("DB_PORT", dbConfig.getPort())))
      .setDatabase(System.getenv().getOrDefault("DB_NAME", dbConfig.getDatabase()))
      .setUser(System.getenv().getOrDefault("DB_USER", dbConfig.getUser()))
      .setPassword(System.getenv().getOrDefault("DB_PASSWORD", dbConfig.getPassword()));

    // Pool options
    PoolOptions poolOptions = new PoolOptions()
      .setMaxSize(5);

    LOG.info("DB connection : {}", connectOptions.toJson());

    return MSSQLPool.pool(vertx, connectOptions, poolOptions);

}
排查方向

1. 生产环境网络层面限制

  • 检查防火墙/安全组规则:确认是否存在单向阻断——允许应用向数据库发起请求,但数据库返回的响应包被拦截。INSERT操作通常需返回影响行数,若响应被拦截会触发连接异常,而READ操作可能因数据量小或规则差异未触发。
  • 排查TCP超时配置:负载均衡、路由器等网络设备的TCP空闲超时是否短于连接池空闲时间,导致连接被提前回收。可在MSSQLConnectOptions中添加setKeepAlive(true)并设置keepAliveInterval,保持连接活跃。

2. 数据库端配置差异

  • 核查连接相关配置:查询生产库sp_configure 'remote query timeout'、sp_configure 'connection timeout',确认是否比测试库的限制更严格。
  • 查看数据库日志:检查生产库的事务日志、错误日志,确认INSERT操作是否触发死锁、磁盘空间不足、锁等待超时等问题,导致数据库主动断开连接。
  • 验证隔离级别:若生产库使用SERIALIZABLE等高隔离级别,INSERT操作可能引发长时间锁等待,最终导致连接中断。

3. 连接池配置优化

  • 调整池大小:当前setMaxSize(5),若生产环境并发INSERT请求量超过池容量,会导致连接排队超时,可临时调大值观察是否缓解。
  • 启用连接验证:在PoolOptions中添加连接校验规则,确保从池内取出的连接可用:
    PoolOptions poolOptions = new PoolOptions()
      .setMaxSize(10)
      .setTestOnBorrow(true)
      .setQuery("SELECT 1");
    
  • 显式配置超时参数:在MSSQLConnectOptions中设置setConnectTimeout(30000)(30秒)、setIdleTimeout(600000)(10分钟),避免默认值引发的超时。

4. INSERT操作本身的问题

  • 检查数据规模:生产环境是否存在单条INSERT数据过大(如大字段、批量插入行数过多),导致数据库处理超时或网络传输中断,可尝试拆分数据后插入。
  • 验证数据内容:生产数据是否包含测试环境没有的特殊字符/编码问题,导致数据库解析异常进而断开连接。

内容的提问来源于stack exchange,提问作者Sudhanshu Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:52:46