测试数据库连接池吞吐量的核心是模拟并发获取、执行空查询(如SELECT 1)、归还连接的完整生命周期,统计单位时间成功处理数(TPS),剥离SQL执行与数据库负载干扰,专注评估连接复用能力。

测试数据库连接池的吞吐量,核心是模拟并发获取连接、执行轻量操作(如空查询)、归还连接的完整生命周期,并统计单位时间内的成功处理数(TPS)。不测 SQL 执行逻辑,只测连接复用能力。
设计真实有效的压测场景
连接池吞吐量反映的是“连接供给能力”,不是数据库或业务逻辑性能。因此测试要剥离干扰:
- 使用 无实际数据操作的语句,例如
SELECT 1或DO 1,避免 IO 和锁竞争影响结果 - 每次获取连接后立即执行一次简单查询,再立刻关闭(归还),不跨线程复用、不缓存连接对象
- 线程数应覆盖并略超
maximumPoolSize,才能触发排队和超时行为,暴露瓶颈 - 持续运行足够时长(建议 ≥ 60 秒),跳过预热阶段(前 5–10 秒)再采样,确保连接池进入稳态
用 Java 写一个轻量级压测代码
以下基于 HikariCP + Java 虚拟线程(JDK 21+),可轻松发起数千并发:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=false");
config.setUsername("root");
config.setPassword("123");
config.setMaximumPoolSize(50);
config.setMinimumIdle(10);
config.setConnectionTimeout(3000);
config.setIdleTimeout(600000);
config.setMaxLifetime(1800000);
HikariDataSource ds = new HikariDataSource(config);
<p>// 并发执行 1000 次连接-查询-释放
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
long start = System.nanoTime();
List<Future<?>> futures = IntStream.range(0, 1000)
.mapToObj(i -> executor.submit(() -> {
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT 1")) {
ps.execute(); // 不取结果集,只验证连接可用
}
}))
.toList();
futures.forEach(f -> { try { f.get(); } catch (Exception e) {} });
long end = System.nanoTime();
double tps = 1000 / ((end - start) / 1_000_000_000.0);
System.out.printf("吞吐量:%.1f TPS%n", tps);
}关键指标与健康参考值
仅看 TPS 不够,需结合三类指标交叉判断:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 平均连接获取耗时:应稳定在 20ms,说明连接争用严重或配置过小
-
活跃连接峰值:接近
maximumPoolSize且长时间满载,说明池子偏小 -
等待连接的线程数:HikariCP 可通过
getThreadsAwaitingConnection()获取;持续 >0 表示存在排队
典型健康目标(MySQL + HikariCP):50 连接池下,稳定 TPS ≥ 8000,平均获取耗时 ≤ 8ms,无排队线程。
配合监控验证结果
光靠压测脚本不够,必须读取连接池运行时指标:
- HikariCP 提供 JMX 接口,可查
ActiveConnections、IdleConnections、ThreadsAwaitingConnection - 启用
metricRegistry(如 Dropwizard Metrics),上报到 Prometheus,观察趋势 - 检查 MySQL 的
Threads_connected是否与池配置匹配,排除数据库侧限制
如果压测 TPS 高但数据库连接数远低于预期,可能是驱动未启用复用(如 URL 缺少 &cachePrepStmts=true)或连接被意外关闭。

















