概述
在项目运行过程中,有些操作对系统资源消耗较大,比如建立数据库连接,建立复述,连接等操作,我们希望一次性创建多个连接对象,并在以后需要使用时能直接使用已创建好的连接,达到提高性能的目的。池技术通过提前将一些占用较多资源的对象初始化,并将初始化后的对象保存到池中备用,达到提高应用服务性能的目的,数据库的JDBC连接池和能连接池等都使用了池技术。
Apache-Commons-Pool2提供了一套池技术的规范接口和实现的通用逻辑,我们只需要实现其抽象出来的方法就可以了。这篇博文主要分享基于Apache-Commons-Pool2来实现Grpc连接池的应用。
关于Grpc相关的内容,大家如想了解基本的实现方法,可以参考我的另一篇博客(传送门):https://blog.51cto.com/andrewli/2058908
核心组件
我们先来了解一下Apache-Commons-Pool2规范接口中涉及到的几个核心组件,包括:
-
<李> ObjectPool
对象池,用于存储对象,并管理对象的入池和出池。对象池的实现类是GenericObjectPool
池属性,用于设置连接池的一些配置信息,比如最大池容量,超过池容量后的处理逻辑等。池属性的实现类是:GenericObjectPoolConfig;李> <李> ObjectFactory
对象工厂,在需要的时候生成新的对象实例,并放入池中。对象工厂的接口是:界面PooledObjectFactory
池对象,由对象工厂负责创建,并放入到对象池中,需要使用时从对象池中取出,执行对象的业务逻辑,使用完后再放回对象池,池对象的接口是:接口PooledObject
核心组件依赖关系及其工作流程
接口与类之间的依赖关系
在梳理连接池相关的核心组件工作流程之前,我们先来了解一下核心组件涉及到的类和接口之间的继承和实现关系。
李> <李>对象池类的继承关系
对象池的最顶层接口是ObjectPool
由于GenericObjectPool
池属性类的继承关系
池属性的最上层接口是接口可克隆,抽象类BaseObjectPoolConfig实现了这个接口,并定义了默认的池配置属性。
GenericObjectPoolConfig类继承了BaseObjectPoolConfig,同样定义了默认的池配置属性值。
我们可以直接使用GenericObjectPoolConfig类,或者继承GenericObjectPoolConfig类,根据自己的需求设置自定义池配置属性。
池内对象类的继承关系
池内对象类实现了上层的PooledObject
另外,池内对象类还需要定义类本身需要具备的成员属性和需要实现的业务方法。
对象工厂类实现了最上层的PooledObjectFactory
![基于Apache-Commons-Pool2实现Grpc客户端连接池](/zixun/d/file/hulianwang/2021-06-03/1ba9acdf12dfe5a56a6c7a4e08c0fde4.jpg )
工作流程
根据上述对核心组件的类继承关系分析,我们可以梳理出一个流程,逐步实现各个组件,并组合成一套适用于我们业务的连接池架构。我们来看看这个流程该如何定义。
(1)定义我们的池内对象类ClientObject,并结合我们的实际业务来实现上层接口的方法。