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

记一次用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;
    }
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Richard Chijq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值