`
sillycat
  • 浏览: 2542059 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Object Pool对象池化技术

    博客分类:
  • JAVA
阅读更多
Object Pool对象池化技术

并非所有对象都适合拿来池化??因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。但是对于生成时开销可观的对象,池化技术就是提高性能的有效策略了。

This is my ObjectFactory using object pool:

import org.apache.commons.pool.KeyedPoolableObjectFactory;
import org.apache.commons.pool.impl.GenericKeyedObjectPool;
import org.apache.commons.pool.impl.GenericKeyedObjectPool.Config;


public class StateMachineFactory implements KeyedPoolableObjectFactory
{

    private static GenericKeyedObjectPool _objectPool = null;

    public Object makeObject(Object key) throws Exception
    {
        ResumeableVendorOrderProcessor resumeableVendorOrderProcessor = null;
        Class aClass = null;

        if ((null != key))
        {
            try
            {
                aClass = Class.forName("the process class name, you need change this", true, this.getClass().getClassLoader());
                resumeableVendorOrderProcessor = (ResumeableVendorOrderProcessor) aClass.newInstance();
            }
            catch (Exception e)
            {
                Log.error(this, "makeObject() exception:" + e);
            }
        }
        return (resumeableVendorOrderProcessor);
    }

    public void destroyObject(Object key, Object object) throws Exception
    {

    }

    public boolean validateObject(Object key, Object object)
    {
        return (true);
    }

    public static ResumeableVendorOrderProcessor getNewInstance(Object key)
    {
        Log.info(StateMachineFactory.class, "getNewInstance() - key: " + key);
        ResumeableVendorOrderProcessor resumeableVendorOrderProcessor = null;
        Class aClass = null;

        if ((null != key))
        {
            try
            {
                aClass = Class.forName("the process class name, you need change this");
                resumeableVendorOrderProcessor = (ResumeableVendorOrderProcessor) aClass.newInstance();
            }
            catch (Exception e)
            {
                Log.error(StateMachineFactory.class, "getNewInstance() exception:" + e);
            }
        }
        return (resumeableVendorOrderProcessor);
    }

    synchronized public static ResumeableVendorOrderProcessor getInstance(Object key)
    {
        ResumeableVendorOrderProcessor resumeableVendorOrderProcessor = null;
        String vendorId = "";

        try
        {
            if (null == _objectPool)
            {
                initObjectPool(false);
            }

            if ((null != key) && (null != _objectPool))
            {
                vendorId = (String) key;
                if (vendorId != null && !"".equals(vendorId))
                {
                    resumeableVendorOrderProcessor = (ResumeableVendorOrderProcessor) _objectPool.borrowObject(vendorId);
                }
            }
        }
        catch (Throwable e)
        {
            Log.error(StateMachineFactory.class, "makeObject() exception:" + e);
        }
        return (resumeableVendorOrderProcessor);
    }

    synchronized public static void returnInstance(Object key, ResumeableVendorOrderProcessor resumeableVendorOrderProcessor)
    {
        String vendorId = null;

        if ((null != key) && (null != _objectPool))
        {
            try
            {
                vendorId = (String) key;
                Log.info(StateMachineFactory.class, "returnInstance() - Returning " + key);
                _objectPool.returnObject(vendorId, resumeableVendorOrderProcessor);
            }
            catch (Throwable aThrowable)
            {
                aThrowable.printStackTrace();
            }
        }
    }

    synchronized public static void initObjectPool(boolean forceInit)
    {
        Log.info(StateMachineFactory.class, "initObjectPool()");

        Config poolConfiguation = null;

        if ((null == _objectPool) || forceInit)
        {
            _objectPool = new GenericKeyedObjectPool(new StateMachineFactory());
            poolConfiguation = getPoolConfiguration();
            _objectPool.setConfig(poolConfiguation);
        }
    }

    private static Config getPoolConfiguration()
    {
        Log.info(StateMachineFactory.class, "getPoolConfiguration()");

        Config poolConfiguration = new Config();
        // Per key
        poolConfiguration.maxActive = 25;
        // For entire pool
        poolConfiguration.maxTotal = 2500;
        return (poolConfiguration);
    }

    public void activateObject(Object key, Object object) throws Exception
    {
        Log.info(StateMachineFactory.class, "activeObject");
    }

    public void passivateObject(Object key, Object object) throws Exception
    {
        Log.info(StateMachineFactory.class, "passivateObject");
    }

}

We can call getInstance and returnObject to use object in pool
Everytime you returnObject, you need confirm that the object is stateless, or you need to re-init them.
分享到:
评论

相关推荐

    Apache的对象池化工具commons-pool

    ### Apache Commons Pool:Java对象池化技术详解 #### 一、引言 在现代软件开发过程中,尤其是在基于Java的企业级应用开发中,资源管理和优化变得尤为重要。创建和销毁对象的成本通常较高,特别是在高并发场景下,...

    Object Pool-Demo

    在Unity3D游戏开发中,"Object Pool"是一种优化技术,用于管理游戏对象的创建和销毁,以提高性能并减少垃圾回收(Garbage Collection)的压力。本Demo是针对Unity3D内置对象池的一个实例,通过对比使用和不使用对象...

    Object Pool 简单实现

    对象池(Object Pool)是一种设计模式,用于管理对特定类型对象的创建和复用,以减少频繁创建和销毁对象带来的开销。在某些场景下,如游戏开发、数据库连接管理和线程池等,对象的创建和销毁过程可能非常耗时,这时...

    pool-1.5.4

    《Apache Commons Pool 1.5.4:对象池化技术详解》 Apache Commons Pool 是一个广泛使用的开源组件,主要用于实现对象池化技术。版本号"pool-1.5.4"代表着这一组件的一个稳定版本,它在之前的基础上进行了优化和...

    commons-pool-1.5.5.jar.zip

    对象池化是一种优化资源管理的技术,通过预先创建并维护一组可重用对象,避免频繁地创建和销毁对象带来的性能开销。在Java中,commons-pool库为开发者提供了通用的对象池API,支持各种类型的对象池化需求。 1. **...

    commons-pool.jar

    - **Poolable接口**:对象池化的基础,定义了对象在池中的生命周期方法,如`activateObject()`用于激活对象,`passivateObject()`用于准备对象返回到池中,`validateObject()`用于检查对象是否有效,以及`wrap()`...

    commons-pool2-2.10.0.jar

    在Java世界里,对象池化是一种优化资源管理的重要技术,通过对象池可以减少频繁创建和销毁对象带来的性能开销,提升系统效率。这里我们聚焦于其最新版本——`commons-pool2-2.10.0.jar`,深入探讨这个库的核心特性和...

    commons-pool-1.6.jar.zip

    对象池化是一种设计模式,它允许程序预先创建一组对象并保持它们处于就绪状态,以便在需要时快速分配,而不是每次需要时都创建新对象。这种技术在处理昂贵的对象创建或系统资源有限的情况下特别有用。 **对象池的...

    pool:Clojure 的池化库

    ### get-keypool Object Pool get-keypool使用单个 arity 函数来创建对象。 ( def pool ( get-keypool ( fn [k] ( str :heavy k)))) ( borrow pool :object ) ; => ":heavy:object" ; Return key and object ( ...

    commons-pool2-2.4.3-bin.zip

    Apache Commons Pool2是一款开源的Java对象池库,它提供了对象池化的服务,能够有效地管理并复用对象,减少频繁创建和销毁对象带来的性能开销。"commons-pool2-2.4.3-bin.zip"是这个库的2.4.3版本的二进制发布包,...

    Java对象池技术的原理及其实现

    ### Java对象池技术的原理及其实现 #### 摘要 本文深入探讨了Java对象池技术的基本原理及其实现方式,旨在帮助读者理解如何利用对象池优化Java应用程序的性能。通过对对象池技术核心概念——缓存与共享的阐述,本文...

    commons-pool2-2.4.2-src

    通过研究Apache Commons Pool2的源码,开发者不仅可以学习到对象池化的概念,还能了解到如何通过代码实现和优化这种技术。对于想要深入理解Java并发编程和资源管理的开发者来说,这是一个宝贵的参考资料。

    commons-pool2-2.9.0.jar

    这个库是Apache软件基金会开发的,版本号为2.9.0,它提供了高效的对象池化机制,有助于提高应用程序的性能和稳定性。 对象池化是一种设计模式,它通过预先创建一组对象并维护一个池来减少对象的创建和销毁次数。在`...

    dbcp1.4&pool1;.5.6

    总结来说,Apache Commons DBCP 1.4和Apache Commons POOL 1.5.6是两个用于优化数据库访问效率的Java工具包,它们通过对象池化技术提高了系统性能和资源利用率。结合使用这两个组件,可以构建高效、稳定的数据库连接...

    commoms-pool-1.5.4-sources.jar.zip

    它为开发者提供了对象池化的基础设施,帮助开发者有效地管理资源,避免频繁创建和销毁对象带来的性能开销。在本篇文章中,我们将深入探讨Apache Commons Pool 1.5.4版本的源码,理解其核心原理和使用方法。 一、...

    commons-pool-1.5.5-src 源码

    Apache Commons Pool 是一个开源项目,由Apache软件基金会维护,它提供了一个对象池化的实现,用于高效管理资源,如数据库连接、线程或者其他昂贵创建的对象。源码版本为1.5.5,是我们今天要深入探讨的重点。 ...

    commons-pool2-2.6.0-bin.zip

    Apache Commons Pool2是一个Java对象池库,用于管理可重用对象。...通过对象池化,可以显著降低系统资源消耗,提高应用程序的运行效率。在使用DBCP进行数据库连接管理时,Apache Commons Pool2起着至关重要的作用。

    unity3d PoolManager

    总的来说,Unity3D的PoolManager是游戏开发中的一个高效工具,它通过对象复用和池化技术,帮助开发者优化资源管理,提升游戏运行效率,是每一个大型游戏项目不可或缺的一部分。理解并熟练运用PoolManager,将有助于...

Global site tag (gtag.js) - Google Analytics