java对象池管理方式common-pool2使用

 更新时间:2023年05月17日 11:48:56   作者:wangjuntytl  
这篇文章主要为大家介绍了java对象池common-pool2使用示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

common-pool2 使用

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

  • 实现PooledObjectFactory接口:该接口是一种工厂模式,实现其目的是让对象池通过该工厂模式创建管理的对象
  • 创建对象池(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池个性化配置

为了模拟的更真实,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)

以上就是java对象池common-pool2使用的详细内容,更多关于java对象池common-pool2的资料请关注脚本之家其它相关文章!

相关文章

  • 关于File与MultipartFile的用法概述

    关于File与MultipartFile的用法概述

    这篇文章主要介绍了关于File与MultipartFile的用法概述,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • springboot应用服务启动事件的监听实现

    springboot应用服务启动事件的监听实现

    本文主要介绍了springboot应用服务启动事件的监听实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • java基本教程之Thread中start()和run()的区别 java多线程教程

    java基本教程之Thread中start()和run()的区别 java多线程教程

    这篇文章主要介绍了Thread中start()和run()的区别,Thread类包含start()和run()方法,它们的区别是什么?下面将对此作出解答
    2014-01-01
  • 详解 Java HashMap 实现原理

    详解 Java HashMap 实现原理

    这篇文章主要介绍了详解 Java HashMap 实现原理的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • Java中Switch用法代码示例

    Java中Switch用法代码示例

    这篇文章主要介绍了Java中Switch用法代码示例,向大家分享了两段代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • java集合继承关系图分享

    java集合继承关系图分享

    这篇文章主要为大家详细介绍了java集合继承关系图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • SpringBoot中多环境启动配置的教程详解

    SpringBoot中多环境启动配置的教程详解

    在SpringBoot项目的生命周期中,存在不同的环境,我们就需要针对不同环境制定不同名称的配置文件,里面放置不同环境下所需的配置项,下面小编就来和大家详细讲讲SpringBoot如何进行多环境启动配置的吧
    2024-02-02
  • Spring MVC中异常处理的三种方式

    Spring MVC中异常处理的三种方式

    这篇文章主要给大家介绍了关于Spring MVC中异常处理的三种方式,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring MVC具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • 一文详解Java线程的6种状态与生命周期

    一文详解Java线程的6种状态与生命周期

    一个线程在给定的时间点只能处于一种状态。线程可以有6种状态:New、Runnable、Blocked、Waiting、Timed waiting和Terminated。本文将详细讲解这6种状态,需要的可以参考一下
    2022-05-05
  • Intellij IDEA全局替换快捷键整理

    Intellij IDEA全局替换快捷键整理

    这篇文章主要给大家介绍了关于Intellij IDEA全局替换快捷键整理的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论