对象池原理
2024-06-16 10:12:14 0 举报
对象池原理
作者其他创作
大纲/内容
GenericObjectPool<PoolableConnection>对连接对象的池化封装
PooledObjectFactory:对象工厂
// 创建一个对象实例,并将其包装在{@link PooledObject}中,以便由池进行管理PooledObject<T> makeObject();// 销毁该对象实例void destroyObject(PooledObject<T> p);// 检查该对象实例是否是初始化的状态,当对象被借出去前,或者归还到池子前都会调用该方法,如果对象无效,则无法借出或者归还会池子,此时返回falseboolean validateObject(PooledObject<T> p);// 当对象被借出去前都会调用该方法,给对象进行初始化,初始化完成后,才允许借出void activateObject(PooledObject<T> p);// 反初始化,每次回收的时候都会执行这个方法void passivateObject(PooledObject<T> p);
Connection连接对象
池外空间
驱逐测试
borrow
有效性检查
放逐:abandon我们再看来放逐,对象出借时间太长(由removeAbandonedTimeout控制),我们就把他们称作流浪对象,这些对象很有可能是那些用完不还的坏蛋们的杰作,也有可能是对象使用者出现了什么突发状况,比如网络连接超时时间设置长于放逐时间。总之,被放逐的对象是不允许再次回归到对象池中的,他们会被搁置到abandon空间,进而进入invalid空间再被gc掉以完成他们的使命。
invalidate
ObjectPool:对象池
通过原始的JDBC获取Connection对象
PoolableConnection可池化的连接对象
通过DataSource获取Connection对象
被借出去很久的
RETURNING:正在被归还到池里
abandon
INVALID:对象不可用 即将/已经被销毁
return
VALIDATION:在队列中,正在被检查,每隔一段时间对池中所有的idle对象进行有效性检查,以排除那些已经失效的对象。失效的对象将会弃置到invalid空间
JBCP数据源技术的一个组件
IDLE:在池中,处于空闲状态
PoolConfig对象池配置
VALIDATION_RETURN_TO_HEAD:检查通过结束后,被标记为此状态,放回队列头部,后面被优先借出去
ObjectPool对象池
对象池技术的核心组件
BaseObjectPoolConfig:对象池的配置
lifo:提供了后进先出(LIFO)与先进先出(FIFO)两种行为模式的池。默认为true,即当池中有空闲可用的对象时,调用borrowObject方法会返回最近(后进)的实例。fairness:当从池中获取资源或者将资源还回池中时,是否使用java.util.concurrent.locks.ReentrantLock.ReentrantLock 的公平锁机制,默认为false。maxWaitMillis:当对象池资源用尽后,调用者的最大等待时间(单位为毫秒),默认值为-1:表示永远不超时,一直等待,一般不建议使用默认值blockWhenExhausted:当这个值为true的时候,maxWaitMillis参数才能生效。为false的时候,当连接池没资源,则立马抛异常。默认为trueminEvictableIdleTimeMillis:对象的空闲时间,达到此值后空闲的对象将被销毁。evictorShutdownTimeoutMillis:softMinEvictableIdleTimeMillis:连接空闲的最小时间,达到此值后空闲链接将会被移除,且保留minIdle个空闲连接数。默认为-1.numTestsPerEvictionRun:在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认为3evictionPolicyClassName:evict策略的类名,默认为org.apache.commons.pool2.impl.DefaultEvictionPolicy,自定义策略可以实现EvictionPolicy接口testOnCreate:默认false,create的时候检测是否有效,如果无效则从连接池中移除,并尝试继续获取testOnBorrow:默认false,borrow的时候检测是否有效,如果无效则从连接池中移除,并尝试继续获取testOnReturn:默认false,return的时候检测是否有效,如果无效则从连接池中移除,并尝试继续获取testWhileIdle:默认falsetimeBetweenEvictionRunsMillis:空闲连接检测线程检测的周期,毫秒数。如果为负值,表示不运行检测线程。默认为-1
VALIDATION_PREALLOCATED:对象在有效性检查时被借用的,并且由于已配置testOnBorrow,因此如果检查通过则,优先被借出去,否则放到invalid空间
正在被检查的对象
EVICTION:在队列中,当前正进行驱逐测试:驱逐定时器(EvictionTimer)会定时选定一批对象进行驱逐测试,对于符合驱逐条件的对象,将会被对象池无情的驱逐出空闲空间,并丢弃到invalid空间
ABANDONED:放逐状态,即流浪对象,可能是对象使用者出现了什么状况,导致对象出借时间太长,这些被放逐的对象是不允许再次回归到对象池中的,他们会被搁置到abandon空间,进而进入invalid空间再被gc掉
invalid:等待GC回收
正在做驱逐测试的对象
PooledObject池对象
驱逐测试:eviction我们知道对象池的一个重要的特性就是伸缩性,所谓伸缩性是指对象池能够根据当前池中空闲对象的数量(maxIdle和minIdle配置)自动进行调整,进而避免内存的浪费。自动伸缩,这是驱逐所需要达到的目标,他是如何实现的呢?实际上在对象池内部,我们可以维护一个驱逐定时器(EvictionTimer),由timeBetweenEvictionRunsMillis参数对定时器的间隔加以控制,每次达到驱逐时间后,我们就选定一批对象(由numTestsPerEvictionRun参数进行控制)进行驱逐测试
PoolableConnectionFactory可池化的连接对象工厂
ConnectionFactory对象对象工厂
abandon:放逐空间
DataSource是对从ConnectionPool获取Connection对象的一层封装
ALLOCATED:已出借状态
EVICTION_RETURN_TO_HEAD:如果对象刚好在做驱逐测试,而此时该对象又被选为要借出去对象,则此时会将对象状态设置为该状态,驱逐测试后,如果对象仍然可用,则保存在队列头部,后续可以优先被借出去
idle:空闲对象
ObjectPool
PooledObjectFactory池对象工厂
0 条评论
下一页