java 数据库连接池配置限流的核心做法是启用并设置 maxwait(或 maxwaitmillis)参数,当请求获取连接的线程数超过当前可用连接数时,强制进入等待队列并在超时后抛出异常。以 druid 为例,通过设置 maxwait=5000 毫秒,可以确保在高并发场景下不会无限期阻塞,而是快速失败。

Druid 连接池如何配置最大等待时间
在 Druid 中,通过 maxWait 属性控制获取连接的超时时间。该值以毫秒为单位,默认值为 -1(无限等待)。设置为正整数后,若指定时间内无法获取到空闲连接,将抛出 GetConnectionTimeoutException。

import com.alibaba.druid.pool.DruidDataSource; import java.sql.Connection; import java.sql.SQLException; public class DruidConfig { public static void main(String[] args) { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mysql://localhost:3306/test"); dataSource.setUsername("root"); dataSource.setPassword("password"); // 核心限流配置:最大等待时间 5000ms dataSource.setMaxWait(5000); try { dataSource.init(); } catch (SQLException e) { e.printStackTrace(); } // 模拟高并发获取连接 for (int i = 0; i { try { Connection conn = dataSource.getConnection(); System.out.println("获取连接成功"); conn.close(); } catch (SQLException e) { System.out.println("获取连接超时或失败: " + e.getMessage()); } }).start(); } } }
预期结果:当并发线程数超过 maxActive(默认8)且无空闲连接时,部分线程会在 5000ms 内抛出异常,而非永久阻塞。
HikariCP 如何配置连接获取超时
HikariCP 使用 connectionTimeout 参数实现类似功能,单位为毫秒。默认值为 30000ms。若在此时间内未获取到连接,则抛出 SQLTransientConnectionException。

import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.sql.Connection; import java.sql.SQLException; public class HikariConfig { public static void main(String[] args) { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/test"); config.setUsername("root"); config.setPassword("password"); // 核心限流配置:连接获取超时 5000ms config.setConnectionTimeout(5000); HikariDataSource ds = new HikariDataSource(config); // 模拟高并发 for (int i = 0; i { try { Connection conn = ds.getConnection(); System.out.println("获取连接成功"); conn.close(); } catch (SQLException e) { System.out.println("获取连接超时: " + e.getMessage()); } }).start(); } } }
预期结果:与 Druid 类似,超出 maxPoolSize 的请求将在 5000ms 后失败,避免系统资源耗尽。
连接池满时抛出的具体异常类型是什么
当连接池达到上限且 maxWait 超时后,不同连接池会抛出不同的异常。Druid 抛出 com.alibaba.druid.pool.GetConnectionTimeoutException,而 HikariCP 抛出 java.sql.SQLTransientConnectionException。开发者应在代码中捕获这些异常并进行降级处理,例如记录日志、返回友好错误或触发熔断机制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











