`
zyfautonavi
  • 浏览: 14916 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

pool概览

阅读更多
  创建新的对象并初始化的操作,可能会消耗很多的时间。在这种对象的初始化工作包含了一些费时的操作(例如,从一台位于20,000千米以外的主机上读出一些数据)的时候,尤其是这样。在需要大量生成这样的对象的时候,就可能会对性能造成一些不可忽略的影响。要缓解这个问题,除了选用更好的硬件和更棒的虚拟机以外,适当地采用一些能够减少对象创建次数的编码技巧,也是一种有效的对策。对象池化技术(Object Pooling)就是这方面的著名技巧,而Jakarta Commons Pool组件则是处理对象池化的得力外援。

对象池化技术

对象池化的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销。用于充当保存对象的“容器”的对象,被称为“对象池”(Object Pool,或简称Pool)。

对于没有状态的对象(例如String),在重复使用之前,无需进行任何处理;对于有状态的对象(例如StringBuffer),在重复使用之前,就需要把它们恢复到等同于刚刚生成时的状态。由于条件的限制,恢复某个对象的状态的操作不可能实现了的话,就得把这个对象抛弃,改用新创建的实例了。

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

PoolableObjectFactory、ObjectPool和ObjectPoolFactory

在Pool组件中,对象池化的工作被划分给了三类对象:

PoolableObjectFactory用于管理被池化的对象的产生、激活、挂起、校验和销毁;
ObjectPool用于管理要被池化的对象的借出和归还,并通知PoolableObjectFactory完成相应的工作;
ObjectPoolFactory则用于大量生成相同类型和设置的ObjectPool。
相应地,使用Pool组件的过程,也大体可以划分成“创立PoolableObjectFactory”、“使用ObjectPool”和可选的“利用ObjectPoolFactory”三种动作。

PoolableObjectFactory、ObjectPool和ObjectPoolFactory

在Pool组件中,对象池化的工作被划分给了三类对象:

PoolableObjectFactory用于管理被池化的对象的产生、激活、挂起、校验和销毁;
ObjectPool用于管理要被池化的对象的借出和归还,并通知PoolableObjectFactory完成相应的工作;
ObjectPoolFactory则用于大量生成相同类型和设置的ObjectPool。
相应地,使用Pool组件的过程,也大体可以划分成“创立PoolableObjectFactory”、“使用ObjectPool”和可选的“利用ObjectPoolFactory”三种动作。


创立PoolableObjectFactory

Pool组件利用PoolableObjectFactory来照看被池化的对象。ObjectPool的实例在需要处理被池化的对象的产生、激活、挂起、校验和销毁工作时,就会调用跟它关联在一起的PoolableObjectFactory实例的相应方法来操作。

PoolableObjectFactory是在org.apache.commons.pool包中定义的一个接口。实际使用的时候需要利用这个接口的一个具体实现。Pool组件本身没有包含任何一种PoolableObjectFactory实现,需要根据情况自行创立。

创立PoolableObjectFactory的大体步骤是:

创建一个实现了PoolableObjectFactory接口的类。
import org.apache.commons.pool.PoolableObjectFactory;
public class PoolableObjectFactorySample
        implements PoolableObjectFactory {
    private static int counter = 0;
}




为这个类添加一个Object makeObject()方法。这个方法用于在必要时产生新的对象。
public Object makeObject() throws Exception {
    Object obj = String.valueOf(counter++);
    System.err.println("Making Object " + obj);
    return obj;
}




为这个类添加一个void activateObject(Object obj)方法。这个方法用于将对象“激活”――设置为适合开始使用的状态。
public void activateObject(Object obj) throws Exception {
    System.err.println("Activating Object " + obj);
}




为这个类添加一个void passivateObject(Object obj)方法。这个方法用于将对象“挂起”――设置为适合开始休眠的状态。
public void passivateObject(Object obj) throws Exception {
    System.err.println("Passivating Object " + obj);
}




为这个类添加一个boolean validateObject(Object obj)方法。这个方法用于校验一个具体的对象是否仍然有效,已失效的对象会被自动交给destroyObject方法销毁
public boolean validateObject(Object obj) {
    boolean result = (Math.random() > 0.5);
    System.err.println("Validating Object "
            + obj + " : " + result);
    return result;
}




为这个类添加一个void destroyObject(Object obj)方法。这个方法用于销毁被validateObject判定为已失效的对象。
public void destroyObject(Object obj) throws Exception {
    System.err.println("Destroying Object " + obj);
}




最后完成的PoolableObjectFactory类似这个样子:


          PoolableObjectFactorySample.java

        

import org.apache.commons.pool.PoolableObjectFactory;
public class PoolableObjectFactorySample
        implements PoolableObjectFactory {
    private static int counter = 0;
    public Object makeObject() throws Exception {
        Object obj = String.valueOf(counter++);
        System.err.println("Making Object " + obj);
        return obj;
    }
    public void activateObject(Object obj) throws Exception {
        System.err.println("Activating Object " + obj);
    }
    public void passivateObject(Object obj) throws Exception {
        System.err.println("Passivating Object " + obj);
    }
    public boolean validateObject(Object obj) {
        /* 以1/2的概率将对象判定为失效 */
        boolean result = (Math.random() > 0.5);
        System.err.println("Validating Object "
                + obj + " : " + result);
        return result;
    }
    public void destroyObject(Object obj) throws Exception {
        System.err.println("Destroying Object " + obj);
    }
}



分享到:
评论

相关推荐

    commoms-pool-1.5.4-sources.jar.zip

    二、Apache Commons Pool 1.5.4架构概览 Apache Commons Pool的核心组件包括Poolable对象、Pool、Factory和Strategy等。Poolable对象是可回收的,它们包含了一套管理状态的机制;Pool是对象池本身,负责对象的分配...

    11g-ocm考试概览

    ### 11g-OCM 考试概览 #### 一、考试构成与概述 Oracle Certified Master (OCM) 是 Oracle 认证体系中的最高级别认证之一,旨在证明持证者具备深入理解 Oracle 技术并能够解决复杂问题的能力。11g-OCM 认证专注于 ...

    streams配置实例

    #### 一、概览 Oracle Streams 是一种强大的工具,用于捕捉数据库中的更改数据,并将这些更改传播到其他数据库系统。它主要用于实现数据复制、数据分发以及事务处理等功能。本文档将详细介绍如何在Oracle环境中设置...

    Java8并行流中自定义线程池操作示例

    1. 概览 Java8引入了流的概念,流是作为一种对数据执行大量操作的有效方式。并行流可以被包含于支持并发的环境中。这些流可以提高执行性能,以牺牲多线程的开销为代价。在这篇短文中,我们将看一下 Stream API的最大...

    ORACLE-SGA.docx

    - `SHOW SGA`:快速显示SGA的概览。 - `SELECT * FROM V$SGA`:详细列出SGA的各个组件及其大小。 - `SELECT name, bytes/1024/1024 FROM V$SGAINFO`:以MB为单位显示SGA组件的大小。 调整SGA参数以优化性能,可以...

    ORACLE内存全面分析(整理版)

    #### Oracle内存架构概览 Oracle的内存管理是其高效运行的关键因素之一,直接关联着数据库的性能与稳定性。在Oracle内存结构中,主要分为两大类:共享内存(SGA,System Global Area)和进程专用内存(PGA,Program...

    HC路由器配置实例.pdf

    ##### 内容概览 在“HC路由器配置实例.pdf”文档中,详细介绍了如何在一个MSR20系列路由器上进行基本的网络配置及NAT(Network Address Translation,网络地址转换)配置。这些配置包括了内部网络接口(内网接口)的...

    DB2巡检报告相关内容以及图表

    - 打开开关命令: `db2updatemonitorswitchesusing bufferpool on lock on` **2. 快照信息** - **表空间的利用率和状态** - **表空间容器的利用率和状态** - **是否需要收集统计信息** - **数据是否需要重组**...

    oracle实例的内存(SGA和PGA)进行调整,优化数据库性

    #### 一、Oracle实例内存架构概览 Oracle实例的内存结构主要分为两大部分:系统全局区(SGA)和程序全局区(PGA)。SGA是所有用户进程和服务器进程共享的内存区域,而PGA则是为每个用户进程分配的私有内存空间。 *...

    malloc实现代码

    以下是一个简单的`malloc`实现的概览,这个实现主要模拟了系统层面内存分配的逻辑,但并不完全符合实际的操作系统行为: ```cpp #include #include // 假设有一个全局的内存池 char* memory_pool = nullptr; ...

    第2课 内存结构和后台进程

    ##### 1.2 Oracle实例内存结构概览 Oracle实例的内存结构主要包括两个主要部分:系统全局区(System Global Area, SGA)和程序全局区(Program Global Area, PGA)。 ##### 1.3 系统全局区(SGA) SGA是所有服务器进程和...

    db2常见问题分析

    上述命令将会收集当前系统的样本数据,并包括连接信息、系统概览以及服务级别信息。 - **在无法连接的情况下**: ```shell db2support -c -g -s ``` 当无法正常连接数据库时,可以使用该命令来收集部分必要...

    Oracle内存分配与调整--大牛冯春培的一篇文章

    #### 二、Oracle内存架构概览 ##### 2.1 SGA与PGA的区别 - **系统全局区(SGA)**:SGA是一个共享内存区域,所有数据库进程都可以访问它。在UNIX环境下,需要为Oracle设置共享内存段;而在Windows环境中,由于采用单...

    Oracle VM Blade Cluster

    #### 三、Oracle VM概念与组件概览 - **Oracle VM**:一种基于KVM技术的虚拟化平台,支持高性能的虚拟机管理。 - **Oracle VM Templates**:预定义的虚拟机模板,可以快速部署应用程序和服务。 - **Server Pool**:...

    Oracle-mem-structure.doc

    #### 一、Oracle内存架构概览 Oracle的内存管理对于确保数据库性能至关重要。本文档旨在全面解析Oracle内存结构,并重点介绍系统全局区域(SGA)和程序全局区域(PGA),以及如何优化这些内存区域以提高数据库性能...

    web项目常用jar包及说明.zip

    7.commons-pool.jar 8.commons-dbcp.jar Hibernate需要的jar包: 1.hibernate3.jar(hibernate的核心jar包) 2.antlr-2.7.2.jar(语言转换工具,hibernate利用它实现HQL到SQL的转换) 3.commons-collections-3.2.1....

    Oracleblogstudy相关资料.docx

    #### 一、Oracle数据库概览与体系结构 **1.1 Oracle网络结构** - **单层结构(Server-Dumb Terminal)** - **特点**:采用字符界面的非图形终端直接与Oracle数据库串行连接。这种结构下,所有处理均在中央主机上...

    linux线程池c源码

    #### 一、概览 本文将深入解析一个Linux下的线程池实现,该实现使用C语言编写,并遵循GNU通用公共许可证版本2(或之后版本)。线程池是一种软件设计模式,它可以提高程序执行效率,通过复用已创建的线程来减少创建...

Global site tag (gtag.js) - Google Analytics