springboot中Hikari连接池常用参数含义(一)

这篇具有很好参考价值的文章主要介绍了springboot中Hikari连接池常用参数含义(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

yml 配置
minimum-idle,spring boot,后端,java文章来源地址https://www.toymoban.com/news/detail-745276.html

  • minimum-idle:10
    该参数限制数据库连接池保持数据连接的最小数量,如下当我们启动服务时,不做任何请求,服务就会默认建立10个数据库连接。等到有需求的时候就可以及时使用。
    我们启动服务不做任何请求可以看到数据库与服务的连接数就是10. 且状态都为sleep.
    minimum-idle,spring boot,后端,java
    这里记录一个问题,假设有这样一个分布式微服务服务(campus-sign-up-service), 该服务hikari配置如第一张图,如果该服务有2实例,那么这两个实例的最小连接数分别是10,还是公用配置总共为10呢?答案是分别为10,每个实例都会单独按照上面的配置去建立连接。
    这里我们启动两个实例在去查看一下数据库中的连接数量,可以发现实例数量变为2*10=20.
    minimum-idle,spring boot,后端,java
    minimum-idle,spring boot,后端,java
  • maximum-pool-size:40
    该配置意为在同一时间应用向数据库连接池请求的数连接超过最小连接数时,将根据需求扩大数据库连接数,但是该链接数的上线是maximum-pool-size的值,如这里的40。当请求超过最大连接数时,进入等待队列,直到有空闲的连接。
    如下我们创建80个线程去执行业务逻辑计算和数据库请求。
    public AddCourseEntity studentBookCourse(AddCourseEntity addCourseEntity) {
        Date startTime=StudentUtil.getDateTime();
        System.out.println("Start Time:" + startTime);
        for(int i=0;i<=80;i++) {
            Thread thread= new Thread(()->{
                studentHandler.longTransactionTest(addCourseEntity);
            });
            thread.start();
        }
        return addCourseEntity;
    }
    为了保证请求数据库的线程数在同一时间一定大于40,我们在其中一个事务里面再睡60s。(当然真实开发过程中,要避免将耗时的业务逻辑处理加入事务中,长事务会长时间占用其申请到的数据库连接线程,造成极大浪费。当大量请求进来时,数据库链接被消耗完迟迟不能释放,就会阻塞其他请求或是导致其他请求因申请不到数据库链接池中的连接线程而超时失败。如下代码,开始时线程休眠,但是只要运行进入@Transactional 注入的方法,就已经占用数据库资源了,不论这个时候是否开始了数据库的相关操作。最极端的情况,如下我们只保留休眠代码,和数据库操作相关的代码都删除,这个事务方法一样的从方法开始就会占用数据库连接池里面的一个线程
    @Transactional
    public void saveInfoAndTableA(AddCourseEntity addCourseEntity) throws InterruptedException {
        Thread.sleep(60*1000);
        TableA tableA = new TableA();
        StudentUtil.assembleTableA(addCourseEntity, tableA);
        tableARepository.save(tableA);
        addCourseEntity.setTableAId(tableA.getId());
    }
    经过测试我们可以统计到数据库的连接已经达到最大链接数40。
    minimum-idle,spring boot,后端,java
    总共有80个线程在请求,剩余的40个请求线程就被迫处于等待状态。
     
  • connection-timeout: 20000 链接上一个测试结果接续说明,当剩余的40个请求线程等待数据库连接池中释放线程时间超过20s,请求线程就开始报错了
    minimum-idle,spring boot,后端,java
     
  • max-lifetime: 50000 
    idle-timeout: 10000
    如上两个参数我要连着一起总结,官方网站对这两个参数的解释分别如下:
    max-lifetime: This property controls the maximum lifetime of a connection in the pool. An in-use connection will never be retired, only when it is closed will it then be removed. On a connection-by-connection basis, minor negative attenuation is applied to avoid mass-extinction in the pool. We strongly recommend setting this value, and it should be several seconds shorter than any database or infrastructure imposed connection time limit. A value of 0 indicates no maximum lifetime (infinite lifetime), subject of course to the idleTimeout setting. The minimum allowed value is 30000ms (30 seconds). Default: 1800000 (30 minutes)
    idle-timeout: This property controls the maximum amount of time that za connection is allowed to sit idle in the pool. This setting only applies when minimumIdle is defined to be less than maximumPoolSize. Idle connections will not be retired once the pool reaches minimumIdle connections. Whether a connection is retired as idle or not is subject to a maximum variation of +30 seconds, and average variation of +15 seconds. A connection will never be retired as idle before this timeout. A value of 0 means that idle connections are never removed from the pool. The minimum allowed value is 10000ms (10 seconds). Default: 600000 (10 minutes)
    max-lifetime: 最小允许值30s 默认值:30min
    This property controls the maximum lifetime of a connection in the pool: 这句话的意思是如果当前链接处于空闲状态,且存活时间超过设定的最大存活时间,就会关闭这个链接,并根据设置判定是否再启动新的连接。
    idle-timeout: 最小允许值10s 默认值:10min

    测试总结:
    对于这两边我不再展示测试过程,而直接写测试结果(如下结果都是经过反复测试)。
    case 1:配置max-lifetime:50s 而idle-timeout:1s
    显然idle-timeout配置错误小于了其最小允许值,框架将自动使用默认值10min。当我们同时启动40个线程请求,每个需要执行1min,显然单个线程执行时间已经超过了max-lifetime设置的50s,这个时候这40个线程可以成功执行,在40个请求线程都执行完成后不再发起新的请求,数据的这40个链接什么时候释放到最小链接数10呢? 答案是10min后。

    case2:
    配置max-lifetime:50s 而idle-timeout:1s
    同样是case1中的条件,但是我们将测试用例中的单个线程需要执行1min,修改为20s,并且在40个请求线程都执行完成后不再发起新的请求,那么多余的线程多久后释放呢?答案是30s(50s-20s)后,数据库连接数由40降到10.


    case3:配置max-lifetime:50s 而idle-timeout:1min
    如果有40个请求线程,每个如case1中执行1min, 由于执行时间已经超过了max-lifetime的设置,这个时候如果后续不来新的请求,那么多余的线程就按照idle-timeout设置的合理时间去清理多余线程,也就是1min。 总结:max-lifetime是根据请求线程自身情况计算清理时间,重请求线程自身去设定的释放限制,idle-timeout是对所有请求线程进行的
    统一限制。 每个请求都要遵循这两个原则去关闭。由两个原则计算出来的最近时间去判断是否释放请求所占有的数据个链接。
    这里记录一个额外的问题,minimum-idle: 闲时大小的设置是否会消耗我们服务的线程。
    1. minimum-idle:100
    minimum-idle,spring boot,后端,java
    minimum-idle,spring boot,后端,java
    2. minimum-idle:5
    minimum-idle,spring boot,后端,java
    minimum-idle,spring boot,后端,java
    从而可以得出结论,数据的连接池数量,应该是由hikri的统一管理的,并不会因为闲时线程数量的设置变大,而而外的消耗我们服务的线程资源。

到了这里,关于springboot中Hikari连接池常用参数含义(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot实现多数据源配置(Druid/Hikari)

    使用springboot+mybatis-plus+(Druid/Hikari)实现多数据源配置 操作步骤: 引入相应的maven坐标 编写mybatis配置,集成mybatis或mybatis-plus(如果已集成可跳过) 编写数据源配置类 编写注解,并通过aop进行增强(编写数据源切换代码) 类或方法中使用注解,对数据源进行切换 第一步:

    2024年02月13日
    浏览(51)
  • 【Spring Boot】Spring Boot 配置 Hikari 数据库连接池

    数据库连接池是一个提高程序与数据库的连接的优化,连接池它主要作用是提高性能、节省资源、控制连接数、连接管理等操作; 程序中的线程池与之同理,都是为了优化、提高性能。

    2024年02月11日
    浏览(53)
  • ElasticSearch minimum_should_match 参数详解

    minimum_should_match :可以使用 minimum_should_match 参数来指定返回文档 必须(must) 匹配的should子句的数量或百分比。可以称他-最小匹配度 如果 bool 查询至少包含一个 should 子句,并且没有 must 或 filter 子句,则默认值为 1。 否则,默认值为 0。 minimum_should_match参数一般放到should叶子查

    2024年02月19日
    浏览(38)
  • SpringBoot数据源——为什么平时默认线程池是Hikari

    本文主要对DataSourceAutoConfiguration类进行讲解,然后对这个类的注解做一个解释,所以直接打开这个类,开始看…… ps:我用的版本是2.3.0.RELEASE 目录 DataSourceAutoConfiguration类注解 @Configuration(proxyBeanMethods = false) @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @ConditionalOnMis

    2024年02月06日
    浏览(55)
  • 基于注解切换、Hikari实现的SpringBoot动态数据源(支持JNDI)

    先说效果,要实现方法级别注解切换当前数据源,不设置注解时走默认数据源,同时支持JNDI源。 Spring框架中存在一个抽象类 AbstractRoutingDataSource ,他是一个可以动态选择当前DataSource的路由类,我们就是要从这里入手,重新实现数据源的切换选择逻辑。然后借助注解和切面,

    2024年02月08日
    浏览(79)
  • Springboot常用方法参数注解及示例

    Springboot常用方法参数注解及示例 一、 @RequestParam : 从URL查询参数中提取数据。 二、 @PathVariable : 从URL路径中提取数据。 三、 @RequestBody : 从请求体中提取数据,并映射到对象。 四、 @RequestHeader : 从请求头中提取数据。 五、 @Validated / @Valid : 启用方法参数校验,确保参

    2024年02月10日
    浏览(43)
  • ES 布尔查询中 minimum_should_match 参数使用避坑

    在 Elasticsearch (ES) 中,布尔查询(Boolean Query)是一种查询类型,它允许你组合多个查询子句以控制搜索结果的匹配逻辑。minimum_should_match 是布尔查询中一个重要的参数,用于指定至少应该匹配的子句数量。 minimum_should_match 的值可以是一个具体的数字,也可以是一个百分比。它

    2024年02月09日
    浏览(40)
  • Springboot GET和POST请求的常用参数获取方式

    可以在控制器方法的参数上使用@RequestParam注解来获取请求中的参数值。例如: 可以为@RequestParam注解的参数提供默认值,以处理参数缺失的情况。例如: 可以使用@RequestParam MapString, String来获取所有的请求参数键值对。例如: 如果参数是作为路径的一部分传递的,可以使用

    2024年02月10日
    浏览(86)
  • 【SpringBoot】常用的的各种注解(一):Controller中的请求参数

    请求路径中的参数,可以有一个或者多个 在Postman中也是直接在请求路径中添加参数即可 获取查询参数,形式为 url?name=张三 ,可以有一个或者多个。 在Postman中可以使用 Query Params 的方式添加参数: 也可以使用Body中的 form-data 的形式添加参数 一般用于传输DTO参数,只能有一

    2024年02月06日
    浏览(50)
  • SpringBoot+内置Tomcat配置,参数调优,最大并发量,最大连接数

    SpringBoot开发最大的好处是简化配置,内置了Tomcat, 在SpringBoot2.0.x版本中内置Tomcat版本是8.5.x,SpringBoot内置Tomcat的默认设置中,Tomcat的等待队列长度默认是100,Tomcat的最小工作线程数默认分配10,Tomcat的最大线程数是200,最大连接数是10000,至于最大并发量和最大连接数,常常理

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包