配置连接池性能测试需要明确目标参数、编写基准测试代码并运行以收集指标。核心做法是初始化一个具体的连接池实例(如 hikaricp 或 druid),设置关键属性,然后通过多线程并发执行数据库查询任务来模拟负载,最后分析响应时间和吞吐量。

如何设置连接池的关键性能参数
设置连接池性能参数的关键在于理解最小空闲连接数、最大连接数和连接超时时间对资源占用和响应速度的影响。通常建议将最大连接数设置为 CPU 核心数的 2 到 4 倍,并根据应用的实际并发需求调整最小空闲连接数以避免冷启动延迟。

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class PoolConfig {
public static void main(String[] args) {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/testdb");
config.setUsername("user");
config.setPassword("password");
// 关键性能参数设置
config.setMaximumPoolSize(10); // 最大连接数
config.setMinimumIdle(5); // 最小空闲连接数
config.setConnectionTimeout(30000); // 连接超时 30秒
config.setIdleTimeout(600000); // 空闲超时 10分钟
config.setMaxLifetime(1800000); // 连接最大生命周期 30分钟
HikariDataSource dataSource = new HikariDataSource(config);
System.out.println("Pool configured with max size: " + config.getMaximumPoolSize());
}
}
上述代码展示了如何使用 HikariConfig 类配置 HikariDataSource。通过设置 maximumPoolSize 控制并发上限,minimumIdle 维持基础连接,connectionTimeout 防止等待连接时线程无限阻塞。这些参数直接决定了连接池在高负载下的行为表现。
立即学习“Java免费学习笔记(深入)”;
如何编写多线程压力测试脚本
编写多线程压力测试脚本需要使用 Java 的 ExecutorService 创建固定大小的线程池,让每个线程获取数据库连接并执行简单的 SQL 查询,同时记录每次操作的耗时。通过统计总执行时间和成功次数,可以计算出平均响应时间和吞吐量。

import java.sql.Connection;
import java.sql.Statement;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class PerformanceTest {
public static void main(String[] args) throws Exception {
HikariDataSource ds = getDataSource(); // 假设已配置好
int threadCount = 20;
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
executor.submit(() -> {
try (Connection conn = ds.getConnection();
Statement stmt = conn.createStatement()) {
stmt.executeQuery("SELECT 1");
} catch (Exception e) {
e.printStackTrace();
}
});
}
executor.shutdown();
executor.awaitTermination(1, TimeUnit.MINUTES);
long endTime = System.currentTimeMillis();
System.out.println("Total time: " + (endTime - startTime) + "ms");
}
}
该测试脚本使用 Executors.newFixedThreadPool 创建 20 个线程,每个线程独立获取连接并执行 SELECT 1 查询。这种设计能充分暴露连接池在并发场景下的瓶颈,如连接耗尽导致的等待或创建新连接的开销。通过调整线程数和请求总数,可以观察不同负载下的性能变化。
连接池在连接耗尽时会发生什么
当连接池中的活跃连接达到 maximumPoolSize 上限且所有连接都在被使用时,后续请求获取连接的线程会被阻塞,直到有连接被归还或超过 connectionTimeout 设置的时间。如果超时仍未获得连接,系统将抛出 SQLException 或 SQLTransientConnectionException。



















