创建新的对象并初始化的操作,可能会消耗很多的时间。在这种对象的初始化工作包含了一些费时的操作(例如,从一台位于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);
}
}
分享到:
相关推荐
二、Apache Commons Pool 1.5.4架构概览 Apache Commons Pool的核心组件包括Poolable对象、Pool、Factory和Strategy等。Poolable对象是可回收的,它们包含了一套管理状态的机制;Pool是对象池本身,负责对象的分配...
### 11g-OCM 考试概览 #### 一、考试构成与概述 Oracle Certified Master (OCM) 是 Oracle 认证体系中的最高级别认证之一,旨在证明持证者具备深入理解 Oracle 技术并能够解决复杂问题的能力。11g-OCM 认证专注于 ...
#### 一、概览 Oracle Streams 是一种强大的工具,用于捕捉数据库中的更改数据,并将这些更改传播到其他数据库系统。它主要用于实现数据复制、数据分发以及事务处理等功能。本文档将详细介绍如何在Oracle环境中设置...
1. 概览 Java8引入了流的概念,流是作为一种对数据执行大量操作的有效方式。并行流可以被包含于支持并发的环境中。这些流可以提高执行性能,以牺牲多线程的开销为代价。在这篇短文中,我们将看一下 Stream API的最大...
- `SHOW SGA`:快速显示SGA的概览。 - `SELECT * FROM V$SGA`:详细列出SGA的各个组件及其大小。 - `SELECT name, bytes/1024/1024 FROM V$SGAINFO`:以MB为单位显示SGA组件的大小。 调整SGA参数以优化性能,可以...
#### Oracle内存架构概览 Oracle的内存管理是其高效运行的关键因素之一,直接关联着数据库的性能与稳定性。在Oracle内存结构中,主要分为两大类:共享内存(SGA,System Global Area)和进程专用内存(PGA,Program...
##### 内容概览 在“HC路由器配置实例.pdf”文档中,详细介绍了如何在一个MSR20系列路由器上进行基本的网络配置及NAT(Network Address Translation,网络地址转换)配置。这些配置包括了内部网络接口(内网接口)的...
- 打开开关命令: `db2updatemonitorswitchesusing bufferpool on lock on` **2. 快照信息** - **表空间的利用率和状态** - **表空间容器的利用率和状态** - **是否需要收集统计信息** - **数据是否需要重组**...
#### 一、Oracle实例内存架构概览 Oracle实例的内存结构主要分为两大部分:系统全局区(SGA)和程序全局区(PGA)。SGA是所有用户进程和服务器进程共享的内存区域,而PGA则是为每个用户进程分配的私有内存空间。 *...
以下是一个简单的`malloc`实现的概览,这个实现主要模拟了系统层面内存分配的逻辑,但并不完全符合实际的操作系统行为: ```cpp #include #include // 假设有一个全局的内存池 char* memory_pool = nullptr; ...
##### 1.2 Oracle实例内存结构概览 Oracle实例的内存结构主要包括两个主要部分:系统全局区(System Global Area, SGA)和程序全局区(Program Global Area, PGA)。 ##### 1.3 系统全局区(SGA) SGA是所有服务器进程和...
上述命令将会收集当前系统的样本数据,并包括连接信息、系统概览以及服务级别信息。 - **在无法连接的情况下**: ```shell db2support -c -g -s ``` 当无法正常连接数据库时,可以使用该命令来收集部分必要...
#### 二、Oracle内存架构概览 ##### 2.1 SGA与PGA的区别 - **系统全局区(SGA)**:SGA是一个共享内存区域,所有数据库进程都可以访问它。在UNIX环境下,需要为Oracle设置共享内存段;而在Windows环境中,由于采用单...
#### 三、Oracle VM概念与组件概览 - **Oracle VM**:一种基于KVM技术的虚拟化平台,支持高性能的虚拟机管理。 - **Oracle VM Templates**:预定义的虚拟机模板,可以快速部署应用程序和服务。 - **Server Pool**:...
#### 一、Oracle内存架构概览 Oracle的内存管理对于确保数据库性能至关重要。本文档旨在全面解析Oracle内存结构,并重点介绍系统全局区域(SGA)和程序全局区域(PGA),以及如何优化这些内存区域以提高数据库性能...
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....
#### 一、Oracle数据库概览与体系结构 **1.1 Oracle网络结构** - **单层结构(Server-Dumb Terminal)** - **特点**:采用字符界面的非图形终端直接与Oracle数据库串行连接。这种结构下,所有处理均在中央主机上...
#### 一、概览 本文将深入解析一个Linux下的线程池实现,该实现使用C语言编写,并遵循GNU通用公共许可证版本2(或之后版本)。线程池是一种软件设计模式,它可以提高程序执行效率,通过复用已创建的线程来减少创建...