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
相关产品推荐
相关产品推荐

