摘要:使用提供了中对象池管理方式,它们的使用方式基本一样,这里以对象池为例介绍其使用方式,一般实现自己的对象池需要经过个步骤实现接口该接口是一种工厂模式,实现其目的是让对象池通过该工厂模式创建管理的对象创建对象池实例创建对象池我们假设对象是一
common-pool2 使用
common-pool2提供了3中对象池管理方式,它们的使用方式基本一样,这里以GenericObjectPool对象池为例介绍其使用方式,一般实现自己的对象池需要经过2个步骤
实现PooledObjectFactory接口:该接口是一种工厂模式,实现其目的是让对象池通过该工厂模式创建管理的对象
创建对象池(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 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)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64712.html
摘要:单例与对象池的区别首先单例和对象池的目的都是为了避免频繁的创建对象带来的系统的开销。池借组与引用可以在内存吃紧时被自动回收来管理对象池中的对象,它可以随着对对象的需要而不断增加。 common-pool2 池技术 池技术,主要用于管理对象,做到对象可以重用,避免多次创建对象的开销,是一种比较常用的技术。比如DB数据源的连接池。 在Java中频繁的创建对象和销毁对象都会消耗性能。为了避免...
摘要:四种引用类型在中,类型就分为两种,基本类型和引用类型或自定义类型。软引用可用来实现内存敏感的高速缓存。一般用法是程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。 Java四种引用类型 在java中,类型就分为两种,基本类型和引用类型或自定义类型。 引用类型又分为四种: 强引用 StrongReference 软引用 SoftReference 若...
摘要:目前主流的数据库连接池有等几种。默认值初始化连接池中的连接数,取值应在与之间,默认为最大空闲时间秒内未使用则连接被丢弃。当连接池中的连接耗尽的时候一次同时获取的连接数。每秒检查所有连接池中的空闲连接。 一、数据库连接池 数据库连接池的基本思想就是为数据库连接建立一个缓冲池,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从缓冲池中取出一个,使用完之后在放回去,节省连接建...
摘要:第二集非必选持续集成编译打包部署到线上环境集成前言在持续集成第一集中讲解了关于如果编译,打包,发布包到私服。在下面一集中,也就是第二集中,开始讲解如何持续集成可运行的服务包到测试和正式环境。 第二集 hudson+gradle+git+maven(非必选)持续集成编译,打包,部署到线上环境集成 前言 在持续集成第一集中,讲解了关于如果编译,打包,发布jar包到maven私服。在下面一集...
阅读 3553·2021-08-31 09:39
阅读 1861·2019-08-30 13:14
阅读 2924·2019-08-30 13:02
阅读 2773·2019-08-29 13:22
阅读 2346·2019-08-26 13:54
阅读 770·2019-08-26 13:45
阅读 1591·2019-08-26 11:00
阅读 986·2019-08-26 10:58
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要