zoukankan      html  css  js  c++  java
  • Hikari创建连接的时机

    • 在连接关闭 closeConnection() 的时候,会调用 fillPool() 进行填充到 minimumIdle 个连接
    • HikariPool连接池初始化 在连接池初始化时,会开启HouseKeeper 去定时检查,也会调用 fillPool() 去填充,但是如果 minimumIdle为0 就没办法了
    • Hikari申请db连接的过程 申请db连接的时候,如果超时未获取到就直接抛异常了;好像并不会去触发连接的创建

    在 HikariPool 初始化的时候,已经知道负责连接创建的 addConnectionExecutor 这个线程池,那么只要找到向它提交任务的地方就可以了;

    发现 HikariPool 实现了 IBagStateListener#addBagItem 接口,在里边执行了连接创建的动作

    // 等待获取db连接的线程数
    public void addBagItem(final int waiting)
    {
       final boolean shouldAdd = waiting - addConnectionQueueReadOnlyView.size() >= 0; // Yes, >= is intentional.
       if (shouldAdd) {
          addConnectionExecutor.submit(poolEntryCreator);
       }
       else {
          logger.debug("{} - Add connection elided, waiting {}, queue {}", poolName, waiting, addConnectionQueueReadOnlyView.size());
       }
    }
    

    再看哪里会调用 HikariPool#addBagItem, 找到 ConcurrentBag#borrow(timeout, timtUnit) 在从底层连接的容器申请db连接时,如果没有可用的 poolEntry,则会 调用 HikariPool#addBagItem 去提交新建db连接的任务;

    所以在连接申请 HikariPool#getConnection() → concurrentBag#borrow 失败的话,也会触发连接的创建

    HikariPool#addBagItem 和 HouseKeeper 的逻辑不一样,addBagItem的场景是此刻db连接就不够用了,需要去创建

    本文来自博客园,作者:mushishi,转载请注明原文链接:https://www.cnblogs.com/mushishi/p/14665231.html

  • 相关阅读:
    jquery选择器
    frameset的target属性
    最长回文子串 南邮NOJ 1100
    最长回文子串 南邮NOJ 1100
    最长回文子串 南邮NOJ 1100
    NOJ 蛇形填数 1094
    NOJ 蛇形填数 1094
    NOJ 蛇形填数 1094
    NOJ 蛇形填数 1094
    开灯问题 南邮NOJ 1589 (另一种解法)
  • 原文地址:https://www.cnblogs.com/mushishi/p/14665231.html
Copyright © 2011-2022 走看看