记一次用SpringBoot默认连接池HikariCP拿不到连接问题
1、问题发现
最近项目总接到反馈有用户登录不上系统情况,通过查看日志,并验证多次访问都是正常。
2、排查问题
安装pinpoint监控后,通过pinpoint监控发现确实会存在获取连接超时情况,如下图
查看最近访问情况,发现存在大量超时情况,如下图
3、定位问题
下图是原本HikariCP数据库连接池配置,发现都没有设置数据库连接池参数。
4、解决问题
后通过调整连接池参数,跟踪监控,问题得以解决,下图是调整后的连接池配置
监控应用访问情况,并没有出现失败情况,下图是调整参数后应用访问情况
5、总结
HikariCP连接池默认的一个连接的生命时长,以及连接空闲状态的最大时长过大。可根据实际情况适当调整参数,下面是调整后的数据源配置。
@Bean(name = "unicomDataSource")
@ConfigurationProperties(prefix="unicom.datasource")
public DataSource unicomDataSource(@Qualifier("unicomDataSourceProperties") DataSourceProperties properties){
HikariDataSource hikariDataSource = properties.initializeDataSourceBuilder().type(HikariDataSource.class)
.build();
hikariDataSource.setIdleTimeout(60000);//一个连接空闲状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
hikariDataSource.setConnectionTimeout(60000);//等待连接池分配连接的最大时长(毫秒),
// 超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
hikariDataSource.setValidationTimeout(3000);//用来指定验证连接有效性的超时时间,默认是5秒
hikariDataSource.setMaxLifetime(60000);//一个连接的生命时长(毫秒),
// 超时而且没被使用则被释放(retired),缺省:30分钟
hikariDataSource.setMaximumPoolSize(maximumPoolSize);//连接池中允许的最大连接数。缺省值:10
hikariDataSource.setMinimumIdle(10);//连接池空闲连接的最小数量。缺省值:10
try {
hikariDataSource.setLoginTimeout(5);
} catch (SQLException e) {
e.printStackTrace();
}
return hikariDataSource;
}