博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
common-pool2 使用
阅读量:6624 次
发布时间:2019-06-25

本文共 6824 字,大约阅读时间需要 22 分钟。

common-pool2 使用

common-pool2提供了3中对象池管理方式,它们的使用方式基本一样,这里以GenericObjectPool对象池为例介绍其使用方式,一般实现自己的对象池需要经过2个步骤

  1. 实现PooledObjectFactory接口:该接口是一种工厂模式,实现其目的是让对象池通过该工厂模式创建管理的对象

  2. 创建对象池(GenericObjectPool(PooledObjectFactory))实例

创建Conn对象池

我们假设Conn对象是一个建立TCP连接的对象,该对象的初始化时间平均为500ms,为了避免在程序中频繁创建Conn对象,我们需要借助对象池管理Conn对象实例

import org.slf4j.LoggerFactory;/** * common-pool2 使用方式 * 

* 假设这是一个建立TCP连接的对象,该对象的初始化时间平均为500ms,为了避免在程序中频繁创建Conn对象,我们需要借助对象池管理Conn对象实例 * * @author WangJun
* @version 1.0 15/10/28 * @since 1.6 */public class Conn { /** * 记录对象的创建时间 */ private long createTime; /** * 初始化Conn对象,模拟创建Conn对象平均消耗500ms * @throws InterruptedException */ public Conn() throws InterruptedException { Thread.sleep(500); createTime = System.currentTimeMillis(); LoggerFactory.getLogger(getClass()).debug(" init conn suc... " + createTime); } /** * 报告Conn对象信息 */ public void report() { LoggerFactory.getLogger(getClass()).info("this is a available conn " + createTime); }}

利用工厂模式,使对象池通过该工厂模式创建管理的对象

package com.peaceful.pool.demo;        import org.apache.commons.pool2.BasePooledObjectFactory;    import org.apache.commons.pool2.PooledObject;    import org.apache.commons.pool2.PooledObjectFactory;    import org.apache.commons.pool2.impl.DefaultPooledObject;        /**     * common-pool2 使用方式     * 

* 为了使用common-pool2对象池管理,我们必须实现{@link org.apache.commons.pool2.PooledObjectFactory}或者其子类 * 这是一个工厂模式,告诉对象池怎样去创建要管理的对象 *

* BasePooledObjectFactory 是对{@link org.apache.commons.pool2.PooledObjectFactory}的一个基本实现,我们可以继承该类,减少一些方法的实现 *

* 在实现{@link org.apache.commons.pool2.PooledObjectFactory}接口时,我们一定要实现的接口方法是{@link PooledObjectFactory#makeObject()}方法。 * * @author WangJun
* @version 1.0 15/10/28 * @since 1.6 */ public class ConnFactory extends BasePooledObjectFactory
{ /** * 间接实现{@link PooledObjectFactory#makeObject()}方法,表明怎样创建需要管理对象 */ @Override public Conn create() throws Exception { return new Conn(); } /** * 在common-pool2中为了统计管理的对象的一些信息,比如调用次数,空闲时间,上次使用时间等,需要对管理的对象进行包装,然后在放入到对象池中 * * @param obj 对象池要管理的对象 * @return 返回包装后的PooledObject对象 */ @Override public PooledObject
wrap(Conn obj) { return new DefaultPooledObject
(obj); } }

为了模拟的更真实,ConnPool池可以让使用者个性化配置

package com.peaceful.pool.demo;        import org.apache.commons.pool2.impl.GenericObjectPoolConfig;        /**     * common-pool2 使用方式     * 

* {@link org.apache.commons.pool2.impl.GenericObjectPool}支持个性化配置,我们可以配置对象池中总共的对象数,最大、最小空闲对象数等等 * 这边继承{@link GenericObjectPoolConfig}是为了ConnPool也可以进行个性化的配置 * * @author WangJun
* @version 1.0 15/10/28 * @since 1.6 */ public class ConnPoolConfig extends GenericObjectPoolConfig { public ConnPoolConfig() { // defaults to make your life with connection pool easier :) setMinIdle(5); setTestOnBorrow(true); } }

有了创建对象的工厂,我们就可以创建一个对象池实例

package com.peaceful.pool.demo;        import org.apache.commons.pool2.impl.GenericObjectPool;        /**     * common-pool2 使用方式     * 

* Conn对象管理池,这里利用GenericObjectPool作为对象池 * * @author WangJun
* @version 1.0 15/10/28 * @since 1.6 */ public class ConnPool extends GenericObjectPool
{ /** * 调用{@link GenericObjectPool}的构造方法,构造ConnPool */ public ConnPool() { super(new ConnFactory(), new ConnPoolConfig()); } /** * 调用{@link GenericObjectPool}的构造方法,构造ConnPool */ public ConnPool(ConnPoolConfig connPoolConfig) { super(new ConnFactory(), connPoolConfig); } }

这样一个就完成了整个ConnPool的编码,下面我们在写一个demo,演示使用ConnPool

public class ConnDemo {            public static void main(String[] args) throws Exception {            ConnPoolConfig connPoolConfig = new ConnPoolConfig();            connPoolConfig.setMinIdle(5);            connPoolConfig.setMaxIdle(8);            ConnPool connPool = new ConnPool(connPoolConfig);            Conn conn1 = connPool.borrowObject();            Conn conn2 = connPool.borrowObject();            Conn conn3 = connPool.borrowObject();            Conn conn4 = connPool.borrowObject();            Conn conn5 = connPool.borrowObject();            conn1.report();            connPool.returnObject(conn1);            conn2.report();            connPool.returnObject(conn2);            conn3.report();            connPool.returnObject(conn3);            conn4.report();            connPool.returnObject(conn4);            conn5.report();            connPool.returnObject(conn5);                conn5.report();                // 被归还的对象的引用,不可以在次归还            // java.lang.IllegalStateException: Object has already been retured to this pool or is invalid            try {                connPool.returnObject(conn5);            }catch (Exception e){                e.printStackTrace();            }        }    }

下面是ConnDemo的运行结果

[2015-10-28 14:56:06 DEBUG]  {com.peaceful.pool.demo.Conn:18}- init conn suc...[2015-10-28 14:56:07 DEBUG]  {com.peaceful.pool.demo.Conn:18}- init conn suc...[2015-10-28 14:56:07 DEBUG]  {com.peaceful.pool.demo.Conn:18}- init conn suc...[2015-10-28 14:56:08 DEBUG]  {com.peaceful.pool.demo.Conn:18}- init conn suc...[2015-10-28 14:56:08 DEBUG]  {com.peaceful.pool.demo.Conn:18}- init conn suc...[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015366746[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015367346[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015367853[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015368354[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015368860[2015-10-28 14:56:08 INFO ]  {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015368860java.lang.IllegalStateException: Object has already been retured to this pool or is invalid    at org.apache.commons.pool2.impl.GenericObjectPool.returnObject(GenericObjectPool.java:595)    at com.peaceful.pool.demo.ConnDemo.main(ConnDemo.java:37)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:606)    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

转载地址:http://votpo.baihongyu.com/

你可能感兴趣的文章
全志A33开发板Linux内核定时器编程
查看>>
全栈必备 敏捷估点
查看>>
一个爬虫小技巧
查看>>
作为一名合格的JAVA架构师需要点亮哪些技能树?
查看>>
为什么短视频会让人刷不停?背后也许用了这套技术
查看>>
Kubernetes 在知乎上的应用
查看>>
Fescar 发布 0.3.1 版本, 支持 ZooKeeper 注册中心
查看>>
【死磕 Spring】----- IOC 之解析 bean 标签:BeanDefinition
查看>>
Java部署环境搭建(Linux)
查看>>
4.1 在SELinux中客体类存在的目的
查看>>
E-HPC支持多队列管理和自动伸缩
查看>>
各种设备的CSS3MediaQuery整理及爽歪歪写法
查看>>
基础为重,Python的基础,成就月薪过万
查看>>
PHP浮点数的精确计算BCMath
查看>>
Oracle RAC安装过程中碰到的“坑”和关键点(一)
查看>>
如何让你的传输更安全——NIO模式和BIO模式实现SSL协议通信
查看>>
【云计算的1024种玩法】使用 NAS 文件储存低价获得好磁盘性能
查看>>
H.264学习笔记之一(层次结构,NAL,SPS)
查看>>
Radware:IP欺诈等让网络攻击难以防范
查看>>
基于Token认证的WebSocket连接
查看>>