记一次用SpringBoot默认连接池HikariCP拿不到连接问题

记一次用SpringBoot默认连接池HikariCP拿不到连接问题

1、问题发现

最近项目总接到反馈有用户登录不上系统情况,通过查看日志,并验证多次访问都是正常。

2、排查问题

安装pinpoint监控后,通过pinpoint监控发现确实会存在获取连接超时情况,如下图
记一次用SpringBoot默认连接池HikariCP拿不到连接问题_第1张图片
查看最近访问情况,发现存在大量超时情况,如下图
记一次用SpringBoot默认连接池HikariCP拿不到连接问题_第2张图片

3、定位问题

下图是原本HikariCP数据库连接池配置,发现都没有设置数据库连接池参数。记一次用SpringBoot默认连接池HikariCP拿不到连接问题_第3张图片

4、解决问题

后通过调整连接池参数,跟踪监控,问题得以解决,下图是调整后的连接池配置

记一次用SpringBoot默认连接池HikariCP拿不到连接问题_第4张图片
监控应用访问情况,并没有出现失败情况,下图是调整参数后应用访问情况
记一次用SpringBoot默认连接池HikariCP拿不到连接问题_第5张图片

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;
    }

你可能感兴趣的:(java,数据库连接池,数据库,java)