common-pool2 使用
common-pool2提供了3中对象池管理方式,它们的使用方式基本一样,这里以GenericObjectPool对象池为例介绍其使用方式,一般实现自己的对象池需要经过2个步骤 1.实现PooledObjectFactory接口:该接口是一种工厂模式,实现其目的是让对象池通过该工厂模式创建管理的对象 2.创建对象池(GenericObjectPool(PooledObjectFactory))实例 创建Conn对象池 我们假设Conn对象是一个建立TCP连接的对象,该对象的初始化时间平均为500ms,为了避免在程序中频繁创建Conn对象,我们需要借助对象池管理Conn对象实例
import org.slf4j.LoggerFactory; /**
* common-pool2 使用方式
* <p/>
* 假设这是一个建立TCP连接的对象,该对象的初始化时间平均为500ms,为了避免在程序中频繁创建Conn对象,我们需要借助对象池管理Conn对象实例
*
* @author WangJun <wangjuntytl@163.com>
* @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 使用方式
* <p/>
* 为了使用common-pool2对象池管理,我们必须实现{@link org.apache.commons.pool2.PooledObjectFactory}或者其子类
* 这是一个工厂模式,告诉对象池怎样去创建要管理的对象
* <p/>
* BasePooledObjectFactory 是对{@link org.apache.commons.pool2.PooledObjectFactory}的一个基本实现,我们可以继承该类,减少一些方法的实现
* <p/>
* 在实现{@link org.apache.commons.pool2.PooledObjectFactory}接口时,我们一定要实现的接口方法是{@link PooledObjectFactory#makeObject()}方法。
*
* @author WangJun <wangjuntytl@163.com>
* @version 1.0 15/10/28
* @since 1.6
*/ public class ConnFactory extends BasePooledObjectFactory<Conn> { /**
* 间接实现{@link PooledObjectFactory#makeObject()}方法,表明怎样创建需要管理对象
*/
@Override
public Conn create() throws Exception {
return new Conn();
} /**
* 在common-pool2中为了统计管理的对象的一些信息,比如调用次数,空闲时间,上次使用时间等,需要对管理的对象进行包装,然后在放入到对象池中
*
* @param obj 对象池要管理的对象
* @return 返回包装后的PooledObject对象
*/
@Override
public PooledObject<Conn> wrap(Conn obj) {
return new DefaultPooledObject<Conn>(obj);
} } 为了模拟的更真实,ConnPool池可以让使用者个性化配置
package com.peaceful.pool.demo; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; /**
* common-pool2 使用方式
* <p/>
* {@link org.apache.commons.pool2.impl.GenericObjectPool}支持个性化配置,我们可以配置对象池中总共的对象数,最大、最小空闲对象数等等
* 这边继承{@link GenericObjectPoolConfig}是为了ConnPool也可以进行个性化的配置
*
* @author WangJun <wangjuntytl@163.com>
* @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 使用方式
* <p/>
* Conn对象管理池,这里利用GenericObjectPool作为对象池
*
* @author WangJun <wangjuntytl@163.com>
* @version 1.0 15/10/28
* @since 1.6
*/ public class ConnPool extends GenericObjectPool<Conn> { /**
* 调用{@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 1446015368860
java.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)
common-pool2 使用的更多相关文章
- apache common pool2原理与实战
完整源码,请帮我点个star哦! 原文地址为https://www.cnblogs.com/haixiang/p/14783955.html,转载请注明出处! 简介 对象池顾名思义就是存放对象的池,与 ...
- Apache common pool2 对象池
对象池的容器:包含一个指定数量的对象.从池中取出一个对象时,它就不存在池中,直到它被放回.在池中的对象有生命周期:创建,验证,销毁,对象池有助于更好地管理可用资源,防止JVM内部大量临时小对象,频繁触 ...
- Memcached、Redis OR Tair
一.前言 非关系型数据库(NoSQL = Not Only SQL)的产品非常多,常见的有Memcached.Redis.MongoDB等优秀开源项目,相关概念和资料网上也非常丰富,不再重复描述,本文 ...
- nginx+tomcat+redis完成session共享
本文记录nginx+redis+tomcat实现session共享的过程 nginx安装:http://blog.csdn.net/grhlove123/article/details/4783467 ...
- React Native 项目整合 CodePush 全然指南
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/y4x5M0nivSrJaY3X92c/article/details/81976844 作者 | 钱 ...
- JedisCluster模式尝试进行批量操作
搭建完redis集群后,可以通过jedis的JedisCluster来访问Redis集群,这里列出使用jedisCluster的spring bean配置方式: <bean id=" ...
- cpu时间 / cpu利用率计算
CPU时间即反映CPU全速工作时完成该进程所花费的时间 cpu时间计算CPU TIME = (# of CPU Clock Cycles) x Clock Period // “#” 表示消耗 ...
- 如何取得jvm实例的cpu占用(转)
时间 2014-08-29 17:11:34 田加国的博客 原文 http://www.tianjiaguo.com/programming-language/java-language/如何取得j ...
- Java 数据持久化系列之池化技术
在上一篇文章<Java 数据持久化系列之JDBC>中,我们了解到使用 JDBC 创建 Connection 可以执行对应的SQL,但是创建 Connection 会消耗很多资源,所以 Ja ...
- Java中对象池的本质是什么?(实战分析版)
简介 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提 ...
随机推荐
- weiphp---------图灵机器人存在的bug。
1.很多人下载下来weiphp源码以后,配置好了图灵机器人却不能使用.原因是因为他源码里面存在一个小bug 上图红色框框内是他的源码,问题就出在这里. 修改方法: if($result ['code' ...
- [原创]java WEB学习笔记91:Hibernate学习之路-- -HQL 迫切左外连接,左外连接,迫切内连接,内连接,关联级别运行时的检索策略 比较。理论,在于理解
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- JavaOOP QuickHit项目分析
项目需求:游戏等级6级,随机字符串每级长度不同.每升一级减少比较次数,但是字符串长度相应增加!每级总分数不同,如果游戏中途输入错误则游戏退出!玩家每次在规定时间内输入字符串的同时,打印出游戏难度等级. ...
- Android -- 自定义View小Demo,关于Path类的使用(一)
1,在我们知道自定义view中onDraw()方法是用于绘制图形的,而Path类则是其中的一个重要的类,如下图效果: 代码也没有什么难度,直接贴出来吧 @Override protected void ...
- VS2012发布网站详细步骤
1.打开你的VS2012网站项目,右键点击项目>菜单中 重新生成一下网站项目:再次点击右键>发布: 2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 输入你自 ...
- DataTable 筛选数据
//使用聚合函数 max ,sum ,count .... private void ComputeBySalesSalesID(DataSet dataSet) { // Presumes ...
- android 三种定位方式
http://www.cnblogs.com/oudi/archive/2012/03/22/2411509.html 最近在看android关于定位的方式,查了很多资料,也做了相关实验,在手机上做了 ...
- [php/html/CSS]给Aptana3 安装 Emmet插件
aptana studio3 安装 zencoding(Emmet) 插件 zen coding 更名为Emmet emmet 谷歌主页地址:http://code.google.com/p/zen- ...
- (function($){...})(jQuery) 函数详解
function(arg){...} 这是一个匿名函数,参数是arg. 而调用匿名函数时,是在函数后面写上括号和实参的,由于操作符的优先级,函数本身也需要用括号,即: function(arg){.. ...
- Floyd算法核心代码证明
Flody 大家都知道这个最终模版: for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i ...