zoukankan      html  css  js  c++  java
  • Hikari关闭连接的时机

    • houseKeeper 定时检查空闲连接,对于超过 minimumIdle 的那部分db连接,如果空闲时长大于 idleTimeout 则关闭 softEvictConnection()
    • db连接从创建后超过最大存活时长 maxLifeTime 的时候 softEvictConnection() 驱除连接
    • 每隔 keepaliveTime 检查连接的有效性,如果db连接不可用,则直接关闭 closeConnection
    • HikariPool#getConnection() 申请到的连接超过500ms未使用,检查连接可用性失败的时候 reserse() + closeConnection()
    • 程序显式调用 HikariDataSource#evictConnection HikariPool#evict Connection
    • 数据源 HikariDataSource#close() 关闭,HikariPool#shutdown() 关闭所有连接

    hikari 关闭连接的前提是,连接当前处于空闲(STATE_IN_USE) 或者 被保留( STATE_RESERVED) 状态

    HikariPool#closeConnection 直接关闭连接的逻辑

    void closeConnection(final PoolEntry poolEntry, final String closureReason)
      {
    			//从池子中移除,前提是poolEntry状态为 STATE_IN_USE或 STATE_RESERVED,并把状态变为 MOVED
          if (connectionBag.remove(poolEntry)) {
    				 // 获取物理连接,交给负责关闭db连接的线程池关闭
             final Connection connection = poolEntry.close();
             closeConnectionExecutor.execute(() -> {
                quietlyCloseConnection(connection, closureReason);
    						//触发一下填充连接的逻辑
                if (poolState == POOL_NORMAL) {
                   fillPool();
                }
             });
          }
      }
    

    houseKeeper 和 maxLifetime 这类检测任务要关闭线程的时候,需要确保db连接空闲才行,调用的是 softEvictConnection 软驱除的方法

    private boolean softEvictConnection(final PoolEntry poolEntry, final String reason, final boolean owner)
    {
       **poolEntry.markEvicted();**
       if (owner || connectionBag.reserve(poolEntry)) {
          closeConnection(poolEntry, reason);
          return true;
       }
     
       return false;
    }
    

    先把连接标记为 evict,如果连接此刻处于空闲状态 connectionBag.reserve(poolEntry) 才能执行成功将其状态变为 RESERVED 状态,进而 直接 closeConnection ;否则要等别的线程申请db连接时,再把 evict=true 的连接给关闭掉

    • hikari 关闭连接的前提是,连接当前处于空闲(STATE_IN_USE) 或者 被保留( STATE_RESERVED) 状态
    • 物理连接关闭后,会调用一下 fillPool(); 维护连接池数量

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

  • 相关阅读:
    python生成试题库和界面 (python generate test database and layout)
    python生成数据库(python generate database)
    Go语言基础之流程控制
    Go语言基础之运算符
    Go语言基础之变量和常量
    VS Code配置Go语言开发环境
    Linux安装教程|详细
    安装Go语言及搭建Go语言开发环境
    Go语言
    Django2.0路由匹配path的用法
  • 原文地址:https://www.cnblogs.com/mushishi/p/14665234.html
Copyright © 2011-2022 走看看