首页 > 编程语言 >[Ngbatis源码学习]Ngbatis源码阅读之连接池的创建

[Ngbatis源码学习]Ngbatis源码阅读之连接池的创建

时间:2023-12-06 23:33:34浏览次数:32  
标签:对象 Ngbatis private GenericObjectPoolConfig 源码 new config public 连接池

Ngbatis源码阅读之连接池的创建

1. NebulaPool的创建

NgbatisBeanFactoryPostProcessor 这个类实现了 BeanFactoryPostProcessor 后置处理器,Ngbatis 连接池的创建就在 postProcessBeanFactory 中实现。关于 BeanFactoryPostProcessor 的有关内容可以参考上一篇文章。

首先来看 org.nebula.contrib.ngbatis.NgbatisBeanFactoryPostProcessor#postProcessBeanFactory 方法,代码如下:

  @Override
  public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
    NebulaPool nebulaPool = nebulaPool();
    // ... 省略部分代码 ...
  }

进入 org.nebula.contrib.ngbatis.NgbatisBeanFactoryPostProcessor#nebulaPool 方法:

  public NebulaPool nebulaPool() {
    NebulaPool pool = new NebulaPool();
    try {
        // 传入地址集合与线程池配置参数
      pool.init(
          nebulaJdbcProperties.getHostAddresses(),
          nebulaJdbcProperties.getPoolConfig()
      );
    } catch (UnknownHostException e) {
      throw new RuntimeException("Can not connect to Nebula Graph");
    }
    return pool;
  }

可以看到主要调用了 init 方法。init 方法传入了两个参数,一个是地址集合参数,一个是线程池配置参数。这两个参数都是通过 yml 配置文件来获取得到。进入 com.vesoft.nebula.client.graph.net.NebulaPool#init 方法:

    public boolean init(List<HostAddress> addresses, NebulaPoolConfig config) throws UnknownHostException, InvalidConfigException {
        // 检查是否已经初始化
        checkInit();
        // 设置是否初始化参数为true
        hasInit.set(true);
        // 检查配置参数是否正确
        checkConfig(config);
        // 等待时间
        this.waitTime = config.getWaitTime();
        // 支持配置多个NebulaGraph连接地址
        List<HostAddress> newAddrs = hostToIp(addresses);
        // 根据是否ssl获取负载均衡器(负载均衡策略:轮询)
        this.loadBalancer = config.isEnableSsl()
                ? new RoundRobinLoadBalancer(newAddrs, config.getTimeout(), config.getSslParam(),
                config.getMinClusterHealthRate())
                : new RoundRobinLoadBalancer(newAddrs, config.getTimeout(),
                config.getMinClusterHealthRate());
        // 根据负载均衡器、配置、 GenericObjectPool 对象池技术创建连接池
        ConnObjectPool objectPool = new ConnObjectPool(this.loadBalancer, config);
        this.objectPool = new GenericObjectPool<>(objectPool);
        // 配置相关配置
        GenericObjectPoolConfig objConfig = new GenericObjectPoolConfig();
        objConfig.setMinIdle(config.getMinConnSize());
        objConfig.setMaxIdle(config.getMaxConnSize());
        objConfig.setMaxTotal(config.getMaxConnSize());
        objConfig.setTestOnBorrow(true);
        objConfig.setTestOnReturn(true);
        objConfig.setTestOnCreate(true);
        objConfig.setTestWhileIdle(true);
        objConfig.setTimeBetweenEvictionRunsMillis(config.getIntervalIdle() <= 0
            ? BaseObjectPoolConfig.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS
            : config.getIntervalIdle());
        objConfig.setSoftMinEvictableIdleTimeMillis(config.getIdleTime() <= 0
            ? BaseObjectPoolConfig.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS
            : config.getIdleTime());
        this.objectPool.setConfig(objConfig);

        AbandonedConfig abandonedConfig = new AbandonedConfig();
        abandonedConfig.setRemoveAbandonedOnBorrow(true);
        this.objectPool.setAbandonedConfig(abandonedConfig);
        // 连接池初始化
        return objectPool.init();
    }

可以看到 NebulaGraph 的连接池其实就是基于 apache commons-pool2 对象池框架对连接进行了池化管理。

以下补充相关核心类 GenericObjectPool 和 GenericObjectPoolConfig 的介绍。

2. GenericObjectPool

Apache Commons Pool 是一个对象池的框架,它提供了一整套用于实现对象池化的API。它提供了三种对象池:GenericKeyedObjectPoolSoftReferenceObjectPoolGenericObjectPool,其中 GenericObjectPool 是最常用的对象池。

对象池的技术其实很常见,比如线程池、数据库连接池,都是针对对象创建代价高,比较消耗资源和性能这些问题得出的解决方案,即使用完对象后不立即释放资源,而是放到一个池子里存起来,下次就能直接从池子里拿出现成可用的对象。

对象池需要具备以下能力:

  • 首先得有个容器数据结构,能存放多个对象,也有数量上限
  • 维持一定数量的常驻对象,当数量与 QPS * RT 匹配的话,业务处理就能直接获取可用对象,不需要消耗对象创建的时间
  • 能应对突发的流量
  • 一定时间内没有获取成功就抛出异常,不会卡死业务现成
  • 具有活性检测机制,从容器中拿出来的对象是可用的

对象获取的核心流程是:

3. GenericObjectPoolConfig

GenericObjectPoolConfig 是在 GenericObjectPool 构造的时候用的,用来设置 pool 的一些属性。

代码如下:

public class GenericObjectPoolConfig<T> extends BaseObjectPoolConfig<T> {
  public static final int DEFAULT_MAX_TOTAL = 8;
  public static final int DEFAULT_MAX_IDLE = 8;
  public static final int DEFAULT_MIN_IDLE = 0;
  private int maxTotal = 8;
  private int maxIdle = 8;
  private int minIdle = 0;

  public GenericObjectPoolConfig() {
  }

  public GenericObjectPoolConfig<T> clone() {
    try {
      return (GenericObjectPoolConfig)super.clone();
    } catch (CloneNotSupportedException var2) {
      throw new AssertionError();
    }
  }
  // ... 省略部分代码 ...
}

可以看到在 GenericObjectPoolConfig 中主要配置了 maxTotal、maxIdle、minIdle:

  • maxTotal:对象池中允许的最大对象个数。

    在从对象池获取对象时,如果对象池中有Idle对象,则直接返回一个对象。否则,判断活跃对象是否已经达到maxTotal,是就会发生阻塞等待,直到有对象归还对象池;没有达到maxTotal,则就会创建一个新对象供使用。

  • maxIdle:对象池中最大空闲的对象个数。

    在归还对象时,对象会处于Idle状态,这时,对象池会判断Idle对象个数,如果已经达到maxIdle,则对象会被直接销毁,否则才会放回对象池

  • minIdle:对象池中最小空闲的对象个数, 默认为0。

    new一个对象池时,会初始创建minIdle个对象。当开启了回收机制后,如果对象空闲时间达到了设定值,则会被销毁、移出对象池。但对象池中至少会保留minIdle个对象。

其实还有其他很多属性,都在父类 BaseObjectPoolConfig 中,浅看一眼:

public abstract class BaseObjectPoolConfig<T> extends BaseObject implements Cloneable {
  // ...
  private Duration maxWaitDuration;
  private Duration minEvictableIdleDuration;
  private Duration evictorShutdownTimeoutDuration;
  private Duration softMinEvictableIdleDuration;
  private int numTestsPerEvictionRun;
  private EvictionPolicy<T> evictionPolicy;
  private String evictionPolicyClassName;
  private boolean testOnCreate;
  private boolean testOnBorrow;
  private boolean testOnReturn;
  private boolean testWhileIdle;
  private Duration durationBetweenEvictionRuns;
  private boolean blockWhenExhausted;
  private boolean jmxEnabled;
  private String jmxNamePrefix;
  private String jmxNameBase;
  // ...
}

标签:对象,Ngbatis,private,GenericObjectPoolConfig,源码,new,config,public,连接池
From: https://www.cnblogs.com/knqiufan/p/17880778.html

相关文章

  • 短视频购物系统源码:构建创新购物体验的技术深度解析
    短视频购物系统作为电商领域的新宠,其背后的源码实现是其成功的关键。本文将深入探讨短视频购物系统的核心技术和源码设计,以揭示其如何构建创新购物体验的技术奥秘。1.技术架构与框架选择短视频购物系统的源码首先考虑的是其技术架构。常见的选择包括前端框架(如React、Vue.js)和后端......
  • PHP+JS实现大文件切片上传功能实现实例源码
    近期公司的项目中,涉及到上传大文件的问题,大文件上传用普通表单上传时出现的问题是,无法断点续存,一但中途中断上传,就要重头开始,这很明显不是我们想要的,所以经过一番查询,学习了一下大文件分割上传的方法。并且使用简单的php做服务端处理程序实现一个功能demo,供以后回顾使用。本人也是......
  • Spring MVC 源码 - HandlerAdapter 组件(二)之 ServletInvocableHandlerMethod
    HandlerAdapter组件HandlerAdapter组件,处理器的适配器。因为处理器handler的类型是Object类型,需要有一个调用者来实现handler是怎么被执行。Spring中的处理器的实现多变,比如用户的处理器可以实现Controller接口或者HttpRequestHandler接口,也可以用@RequestMapping注......
  • VS2019编译PCL1.11.1源码
    最近在使用PCL的体素滤波器进行点云降采样时,遇到了 Leafsizeistoosmallfortheinputdataset的报错,出于某些原因,并不想简单的增大Leafsize来解决这个问题。尝试修改了PCL的源码,但是很可惜,对源码的改动并不能直接应用到我的项目中,于是只能被迫对PCL的sourcecode进行......
  • C语言三维智能PACS系统源码,医学影像采集系统
    三维智能PACS系统源码,医学影像采集传输系统源码PACS系统以大型关系型数据库作为数据和图像的存储管理工具,以医疗影像的采集、传输、存储和诊断为核心,集影像采集传输与存储管理、影像诊断查询与报告管理、综合信息管理等综合应用于一体的综合应用系统。日常产生的各种医学影像通过国......
  • 分享一套 MT4 crm MT4 MT5 CRM源码、web trade交易系统
    一套MT4MT5CRM源码,有跟单社区,同时支持MT4进行对接使用,支持代理返佣自由进行设置,可自动实时同步manager后台分组、交易品种和客户所有信息。包括带有内部实时内转功能,支持任何第三方支付、区块链和电子钱包。整套系统功能齐全。可节约公司大量租用成本和防止第三方公司泄露客户资......
  • 使用 maven 自动将源码打包并发布
    maven-source-plugin作用:在构建过程中将项目的源代码进行打包,并作为一个jar文件附着在主构件上,在pom.xml中添加如下内容,使用maven生成jar的同时生成sources包在pom中配置如下:<build><plugins><plugin><groupId>org.apache.maven.plugins</g......
  • java_JDBC连接池C3P0的使用
    1、数据库连接池基本介绍1.预先再缓冲池中放入一定数量的连接,当需要建立连接时,只需要从“缓冲池”中取出一个,使用完毕后放回。2.数据库连接池负责分配、管理和释放数据库连接,它允许多个程序重复的使用现有的数据库连接,而不是重新建立一个。3.当应用程序向连接池请求的数量超过最大......
  • Optional常用方法实例, 源码挺简单的,重要的是option 与 stream 以及lambda 的连贯使用
    Optionalstaticmethods: Optional.ofNullable();Optional.empty();Optional.of(); ​ empty():publicstatic<T>Optional<T>empty(){@SuppressWarnings("unchecked")Optional<T>t=(Optional<......
  • java智慧校园源码,SaaS云平台,私有云部署
    什么是电子班牌?电子班牌用来显示班级信息,班级活动信息以及学校的通知信息。信息内容为文字、图片、视频、FLASH等,为学生和老师提供新颖的师生交流及校园服务平台。融合了多媒体信息发布、家校互通、物联控制、教务管理、日常办公等一系列应用,是校园管理的现代手段。学生刷卡考勤数......