Apache Commons Pool2 源码分析
来源:互联网 发布:js小写转化为大写 编辑:程序博客网 时间:2024/05/17 02:22
Apache Commons Pool2 源码分析
Commons Pool2本质上是”对象池”,即通过一定的规则来维护对象集合的容器;commos-pool2在很多场景中,用来实现”连接池”/”任务worker池”等,大家常用的Jedis pool数据库连接池,也是基于commons-pool2实现.
commons-pool2实现思想非常简单,它主要的作用就是将"对象集合"池化,任何通过pool进行对象存取的操作,都会严格按照"pool配置"(比如池的大小)实时的"建对象"、"阻塞控制"、"销毁对象"等.它在一定程度上,实现了对象集合的管理以及对象的分发.
- 1 :将创建对象的方式,使用工厂模式;
- 2 :通过”pool配置”来约束对象存取的时机;
- 3 :将对象列表保存在队列中(LinkedList)
一、核心对象
在讲述其实现原理前,先提一下其中有几个重要的对象:
- PooledObject(池对象)。
- PooledObjectFactory(池对象工厂)。
- Object Pool(对象池)。
1.1 PooledObject(池对象)
用于封装对象(如:线程、数据库连接、TCP连接),将其包裹成可被池管理的对象。提供了两个默认的池对象实现:
- DefaultPoolObject。用于非软引用的普通对象。
- PooledSoftReference。用于软引用的对象。
在开发连接池、线程池等组件时,需要根据实际情况重载5个方法:startEvictionTest、endEvictionTest、allocate、deallocate和invalidate,用于在不同的场景下修改被包裹对象的内部状态。
PooledObject有多种状态,在不同的环节或经过处理后状态会发生变化:
1.2 PooledObjectFactory(池对象工厂)
定义了操作PooledObject实例生命周期的一些方法,PooledObjectFactory必须实现线程安全。已经有两个抽象工厂:
- BasePooledObjectFactory。
- BaseKeyedPooledObjectFactory。
1.3 Object Pool(对象池)
Object Pool负责管理PooledObject,如:借出对象,返回对象,校验对象,有多少激活对象,有多少空闲对象。有三个默认的实现类:
- GenericObjectPool。
- ProsiedObjectPool。
- SoftReferenceObjectPool。
二、核心流程
2.1 BorrowObject (借出对象)
下面是GenericObjectPool中borrowObject方法的逻辑实现,有阻塞式和非阻塞式两种获取对象的模式。
2.2 BorrowObject (返回对象)
下面是GenericObjectPool中returnObject方法的逻辑实现,在这里实现的FIFO(先进先出)和LIFO(后进先出)。
- Apache Commons Pool2 源码分析
- apache-common-pool2源码分析
- Apache Commons-pool2简记
- Apache Commons-pool2
- Apache commons-pool2-2.4.2源码学习笔记
- apache commons pool2: 整体结构
- Apache Commons Pool2连接池代码
- 利用Apache commons pool2构建池应用
- 利用Apache commons pool2构建池应用
- Apache Commons-Pool 源码分析
- Apache Commons-Logging 源码分析
- commons pool2
- Apache Commons Pool2-空闲对象的驱逐检测机制
- 报错: org.apache.commons.pool2.impl.GenericObjectPoolConfig not found
- 找不到org.apache.commons.pool2.impl.GenericObjectPoolConfig的解决方法
- apache-comnons系列之commons-pool2.4 学习笔记
- org.apache.commons.lang3.ArrayUtils源码分析
- redis加mybatis,org.apache.commons.pool2.impl.GenericObjectPoolConfig记住这个是pool2!!
- 线段树--数据结构(建树,查询区间和&&最大值&&最小值)
- Spring mvc中把表单数据当做一个对象提交给controller的实现
- Java动态代理机制详解
- ros msg head 中的seq被重写为从0开始。
- 自已动手编译Linux系统-基于ALFS的LFS8.0实践(三)
- Apache Commons Pool2 源码分析
- win7字符界面的目录切换
- java 字节输入流、字节输出流、字节缓冲流
- 2482二叉排序树
- 深度学习论文和开源代码
- 机械臂(4)--正向求解
- 公共CBB实现方案思考
- PHP7.0的新特性
- Python abc模块的几个小知识点