`
zyfautonavi
  • 浏览: 14832 次
  • 性别: 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是对象池本身,负责对象的分配...

    南大通用GBase 8s 共享内存结构概览.pdf

    南大通用GBase 8s 共享内存结构概览 南大通用GBase 8s 共享内存结构是数据库服务器中的一种操作系统功能,允许数据库服务器线程和进程通过共享对内存池的访问权来共享数据。该结构主要用于实现数据的共享和进程间的...

    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内存分配与调整 pdf

    #### 二、Oracle内存架构概览 ##### 1. 系统全局区(SGA) Oracle的内存模型中,**系统全局区(SGA)**是最为关键的部分,它由一系列共享内存段组成,旨在促进所有数据库进程之间的数据交换与通信。SGA的组成部分主要...

    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**:...

    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数据库串行连接。这种结构下,所有处理均在中央主机上...

Global site tag (gtag.js) - Google Analytics