不是。盲目调高最大连接数会压垮数据库或触发连接拒绝,受限于数据库连接上限、资源消耗及真实瓶颈;合理值多为20~50,需压测验证,并设置idleTimeout≤wait_timeout(如5分钟)避免失效连接。
不是。盲目调高 maxPoolSize(如 HikariCP 的 maximumPoolSize,Druid 的 maxActive)反而会压垮数据库或触发连接拒绝。
max_connections=151),超过后新连接直接报错 Too many connections
maxPoolSize=20~50 已足够SHOW PROCESSLIST 观察活跃连接分布,再反推合理值idleTimeout(HikariCP)、minEvictableIdleTimeMillis(Druid)这类参数常被设为 0 或极大值,导致连接长期空闲却未释放,最终占满数据库连接池。
idleTimeout > 这个值,连接在 DB 侧已被服务端关闭,但应用仍认为有效,下次使用就抛 Connection reset 或 Communications link failure
idleTimeout 设为 300000(5 分钟),且必须 wait_timeout;同时开启 connection-test-query 或 validationQuery 做借用前校验testWhileIdle=true 需搭配 timeBetweenEvictionRunsMillis 才生效,单独设前者无效连接未 close、异常路径漏掉 connection.close()、或用了 try-with-resources 但底层 DataSource 不支持自动归还,都会造成连接持续累积——这是最隐蔽也最致命的问题。
leakDetectionThreshold(毫秒)主动检测,例如设为 60000,超 60 秒未归还就打印堆栈;但该参数默认关闭,上线前必须显式启用removeAbandonedOnBorrow=true + re
moveAbandonedTimeout=1800,但会牺牲部分性能,且仅适用于旧版(1.2.16+ 推荐用 removeAbandonedOnMaintenance)HikariPoolMXBean.getActiveConnections() 指标很多人以为 Spring 的 @Transactional 会自动复用连接,其实它依赖的是 DataSource 绑定的 ThreadLocal,一旦跨线程(如 CompletableFuture、线程池回调)、或手动 new Connection,连接就断开了。
DataSourceTransactionManager,其事务上下文与当前线程强绑定;异步操作需显式传播,例如 TransactionSynchronizationManager.getCurrentTransactionName() + 手动传递 connectionSqlSession 默认非线程安全,多线程共用一个 SqlSession 实例会导致连接错乱,应确保每个线程独占 session
close() 方法——它不真正关闭,而是归还到池中;直接调 connection.unwrap() 拿原生 connection 后又没处理好,极易泄漏