- 浏览: 459375 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (233)
- 技术日志 (87)
- portal (7)
- jBPM/Activiti (34)
- Roller学习 (18)
- Java基础、网站开发 (19)
- 收藏URL (4)
- UML (3)
- linux操作 (7)
- 工作环境准备 (8)
- Mina (15)
- tomcat (8)
- Mylyn (3)
- sina网站 (2)
- 规则引擎 (3)
- 工作记录 (11)
- html(5) (9)
- 手机开发 (3)
- oracle (26)
- 常用的 (2)
- maven (8)
- hadoop (0)
- xml (7)
- 错误解决 (5)
- linux (1)
- c# (2)
- c++ (1)
- node.js (1)
- 银行业务知识 (1)
- Java调试 (0)
最新评论
-
tomcatmeng:
请问候选用户是怎样task自己的任务,看网上说先根据任务id先 ...
jBPM4.4:ForEach的使用--动态设置参与人数 -
maoweiwer:
友情提醒:如果是在MYSQL下创建数据库,则还需要更改\jbp ...
jBPM4.4: 创建数据库表 -
zybing:
ganjiang 写道有点疑惑,请lz指点,1.那个“depl ...
jBPM4.4:如何图示化显示当前的流程执行到了哪一步骤 -
zybing:
ganjiang 写道有点疑惑,请lz指点,1.那个“depl ...
jBPM4.4:如何图示化显示当前的流程执行到了哪一步骤 -
ganjiang:
有点疑惑,请lz指点,1.那个“deployId”不知是那个i ...
jBPM4.4:如何图示化显示当前的流程执行到了哪一步骤
一直以来,缓存只考虑缓存有用的数据,有用的对象,但是这篇文章给我我们一个很好的思路,创建对象也是消耗时间的,尤其是大对象。因此除了缓存有用的数据、有用的对象外,还可以考虑缓存大对象,节省系统创建大对象的消耗。
这是IBM 03年的一篇老文章了,“使用Jakarta Commons Pool处理对象池化”,非常不错;
-------------------------------------------------------------------------------------------------------------------------
简介: 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率。Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以有效地减少处理对象池化时的工作量,为其它重要的工作留下更多的精力和时间。 本文的标签: commons-pool 创建新的对象并初始化的操作,可能会消耗很多的时间。在这种对象的初始化工作包含了一些费时的操作(例如,从一台位于20,000千米以外的主机上读出一些数据)的时候,尤其是这样。在需要大量生成这样的对象的时候,就可能会对性能造成一些不可忽略的影响。要缓解这个问题,除了选用更好的硬件和更棒的虚拟机以外,适当地采用一些能够减少对象创建次数的编码技巧,也是一种有效的对策。对象池化技术(Object Pooling)就是这方面的著名技巧,而Jakarta Commons Pool组件则是处理对象池化的得力外援。 对象池化的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销。用于充当保存对象的“容器”的对象,被称为“对象池”(Object Pool,或简称Pool)。 对于没有状态的对象(例如String),在重复使用之前,无需进行任何处理;对于有状态的对象(例如StringBuffer),在重复使用之前,就需要把它们恢复到等同于刚刚生成时的状态。由于条件的限制,恢复某个对象的状态的操作不可能实现了的话,就得把这个对象抛弃,改用新创建的实例了。 并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。但是对于生成时开销可观的对象,池化技术就是提高性能的有效策略了。 说明:英语中的Pool除了“池”之外,还有“供多方共享的资源”意思。作者十分怀疑第二种才是“Object Pool”中的Pool的实际含义,但是“对象池”的说法已经广为流传,而一时又没有足以替代的贴切译法,因此这里仍然沿用这种译名。 Jakarta Commons Pool是一个用于在Java程序中实现对象池化的组件。它的基本情况是: 为了顺利的按照本文中提到的方法使用Pool组件,除去Java 2 SDK外,还需要先准备下列一些东西: 以上两种软件均有已编译包和源代码包两种形式可供选择。一般情况下,使用已编译包即可。不过建议同时也下载源代码包,作为参考资料使用。 如果打算使用源代码包自行编译,那么还需要准备以下一些东西: 具体的编译方法,可以参看有关的Ant文档。 将解压或编译后得到的commons-pool.jar和commons-collections.jar放入CLASSPATH,就可以开始使用Pool组件了。 PoolableObjectFactory、ObjectPool和ObjectPoolFactory 在Pool组件中,对象池化的工作被划分给了三类对象: 相应地,使用Pool组件的过程,也大体可以划分成“创立PoolableObjectFactory”、“使用ObjectPool”和可选的“利用ObjectPoolFactory”三种动作。 Pool组件利用PoolableObjectFactory来照看被池化的对象。ObjectPool的实例在需要处理被池化的对象的产生、激活、挂起、校验和销毁工作时,就会调用跟它关联在一起的PoolableObjectFactory实例的相应方法来操作。 PoolableObjectFactory是在org.apache.commons.pool包中定义的一个接口。实际使用的时候需要利用这个接口的一个具体实现。Pool组件本身没有包含任何一种PoolableObjectFactory实现,需要根据情况自行创立。 创立PoolableObjectFactory的大体步骤是: 最后完成的PoolableObjectFactory类似这个样子: 有了合适的PoolableObjectFactory之后,便可以开始请出ObjectPool来与之同台演出了。 ObjectPool是在org.apache.commons.pool包中定义的一个接口,实际使用的时候也需要利用这个接口的一个具体实现。Pool组件本身包含了若干种现成的ObjectPool实现,可以直接利用。如果都不合用,也可以根据情况自行创建。具体的创建方法,可以参看Pool组件的文档和源码。 ObjectPool的使用方法类似这样: 这些操作都可能会抛出异常,需要另外处理。 比较完整的使用ObjectPool的全过程,可以参考这段代码: 另外,ObjectPool接口还定义了几个可以由具体的实现决定要不要支持的操作,包括: void clear() 清除所有当前在此对象池中休眠的对象。 int getNumActive() 返回已经从此对象池中借出的对象的总数。 int getNumIdle() 返回当前在此对象池中休眠的对象的数目。 void setFactory(PoolableObjectFactory factory) 将当前对象池与参数中给定的PoolableObjectFactory相关联。如果在当前状态下,无法完成这一操作,会有一个IllegalStateException异常抛出。 有时候,要在多处生成类型和设置都相同的ObjectPool。如果在每个地方都重写一次调用相应构造方法的代码,不但比较麻烦,而且日后修改起来,也有所不便。这种时候,正是使用ObjectPoolFactory的时机。 ObjectPoolFactory是一个在org.apache.commons.pool中定义的接口,它定义了一个称为ObjectPool createPool()方法,可以用于大量生产类型和设置都相同的ObjectPool。 Pool组件中,对每一个ObjectPool实现,都有一个对应的ObjectPoolFactory实现。它们相互之间,有一一对应的参数相同的构造方法。使用的时候,只要先用想要的参数和想用的ObjectPoolFactory实例,构造出一个ObjectPoolFactory对象,然后在需要生成ObjectPool的地方,调用这个对象的createPool()方法就可以了。日后无论想要调整所用ObjectPool的参数还是类型,只需要修改这一处,就可以大功告成了。 将 《使用ObjectPool》一节中的例子,改为使用ObjectPoolFactory来生成所用的ObjectPool对象之后,基本就是这种形式: PoolableObjectFactory定义了许多方法,可以适应多种不同的情况。但是,在并没有什么特殊需要的时候,直接实现PoolableObjectFactory接口,就要编写若干的不进行任何操作,或是始终返回true的方法来让编译通过,比较繁琐。这种时候就可以借助BasePoolableObjectFactory的威力,来简化编码的工作。 BasePoolableObjectFactory是org.apache.commons.pool包中的一个抽象类。它实现了PoolableObjectFactory接口,并且为除了makeObject之外的方法提供了一个基本的实现――activateObject、passivateObject和destroyObject不进行任何操作,而validateObject始终返回true。通过继承这个类,而不是直接实现PoolableObjectFactory接口,就可以免去编写一些只起到让编译通过的作用的代码的麻烦了。 这个例子展示了一个从BasePoolableObjectFactory扩展而来的PoolableObjectFactory: 可口可乐公司的软饮料有可口可乐、雪碧和芬达等品种,百事可乐公司的软饮料有百事可乐、七喜和美年达等类型,而Pool组件提供的ObjectPool实现则有StackObjectPool、SoftReferenceObjectPool和GenericObjectPool等种类。 不同类型的软饮料各有各自的特点,分别适应不同消费者的口味;而不同类型的ObjectPool也各有各自的特色,分别适应不同的情况。 StackObjectPool利用一个java.util.Stack对象来保存对象池里的对象。这种对象池的特色是: StackObjectPool的构造方法共有六个,其中: 用不带factory参数的构造方法构造的StackObjectPool实例,必须要在用它的setFactory(PoolableObjectFactory factory)方法与某一PoolableObjectFactory实例关联起来后才能正常使用。 这种对象池可以在没有Jakarta Commmons Collections组件支持的情况下正常运行。 SoftReferenceObjectPool利用一个java.util.ArrayList对象来保存对象池里的对象。不过它并不在对象池里直接保存对象本身,而是保存它们的“软引用”(Soft Reference)。这种对象池的特色是: SoftReferenceObjectPool的构造方法共有三个,其中: 用不带factory参数的构造方法构造的SoftReferenceObjectPool实例,也要在用它的setFactory(PoolableObjectFactory factory)方法与某一PoolableObjectFactory实例关联起来后才能正常使用。 这种对象池也可以在没有Jakarta Commmons Collections组件支持的情况下正常运行。 GenericObjectPool利用一个org.apache.commons.collections.CursorableLinkedList对象来保存对象池里的对象。这种对象池的特色是: GenericObjectPool的构造方法共有七个,其中: 这种对象池不可以在没有Jakarta Commmons Collections组件支持的情况下运行。 调用一个有很多的参数的方法的时候,很可能将参数的位置和个数搞错,导致编译或运行时的错误;阅读包含了有很多参数的方法调用的代码的时候,也很可能因为没有搞对参数的位置和个数,产生错误的理解。因此,人们往往避免给一个方法安排太多的参数的做法(所谓的“Long Parameter List”)。不过,有些方法又确实需要许多参数才能完成工作。于是,就有人想到了一种将大批的参数封装到一个对象(称为参数对象,Parameter Object)里,然后将这个对象作为单一的参数传递的两全其美的对策。 因为生成GenericKeyedObjectPool时可供设置的特性非常之多,所以它的构造方法里也就难免会需要不少的参数。GenericKeyedObjectPool除了提供了几个超长的构造方法之外,同时也定义了一个使用参数对象的构造方法。所用参数对象的类型是GenericKeyedObjectPool.Config。 GenericKeyedObjectPool.Config定义了许多的public字段,每个对应一种可以为GenericKeyedObjectPool设置的特性,包括: 这些字段的作用,与在GenericKeyedObjectPool最复杂的构造方法中与它们同名的参数完全相同。 使用的时候,先生成一个GenericKeyedObjectPool.Config对象,然后将个字段设置为想要的值,最后用这个对象作为唯一的参数调用GenericKeyedObjectPool的构造方法即可。 注意:使用有许多public字段、却没有任何方法的类,也是一个人们往往加以避免的行为(所谓的“Data Class”)。不过这次GenericKeyedObjectPool特立独行了一回。 有时候,单用对池内所有对象一视同仁的对象池,并不能解决的问题。例如,对于一组某些参数设置不同的同类对象――比如一堆指向不同地址的java.net.URL对象或者一批代表不同语句的java.sql.PreparedStatement对象,用这样的方法池化,就有可能取出不合用的对象的麻烦。 可以通过为每一组参数相同的同类对象建立一个单独的对象池来解决这个问题。但是,如果使用普通的ObjectPool来实施这个计策的话,因为普通的PoolableObjectFactory只能生产出大批设置完全一致的对象,就需要为每一组参数相同的对象编写一个单独的PoolableObjectFactory,工作量相当可观。这种时候就适合调遣Pool组件中提供的一种“带键值的对象池”来展开工作了。 Pool组件采用实现了KeyedObjectPool接口的类,来充当带键值的对象池。相应的,这种对象池需要配合实现了KeyedPoolableObjectFactory接口的类和实现了KeyedObjectPoolFactory接口的类来使用(这三个接口都在org.apache.commons.pool包中定义): 另外Pool组件也提供了BaseKeyedPoolableObjectFactory,用于充当和BasePoolableObjectFactory差不多的角色。 void clear、int getNumActive、int getNumIdle和void setFactory的各种版本都仍然是可以由具体实现自行决定是否要支持的方法。如果所用的KeyedObjectPool实现不支持这些操作,那么调用这些方法的时候,会抛出一个UnsupportedOperationException异常。 这一类对象池的基本使用方法接近于这样: Pool组件自带的KeyedObjectPool的实现有StackKeyedObjectPool和GenericKeyedObjectPool两种。它们的使用方法分别与它们各自的近亲KeyedObjectPool和KeyedObjectPool基本一致,只是原来使用GenericObjectPool.Config的地方要使用GenericKeyedObjectPool.Config代替。 Java并未提供一种机制来保证两个方法被调用的次数之间呈现一种特定的关系(相等,相差一个常数,或是其它任何关系)。因此,完全可以做到建立一个ObjectPool对象,然后调用一次borrowObject方法,借出一个对象,之后重复两次returnObject方法调用,进行两次归还。而调用一个从不曾借出对象的ObjectPool的returnObject方法也并不是一个不可完成的任务。 尽管这些使用方法并不合乎returnObject的字面意思,但是Pool组件中的各个ObjectPool/KeyedObjectPool实现都不在乎这一点。它们的returnObject方法都只是单纯地召唤与当前对象池关联的PoolableObjectFactory实例,看这对象能否经受得起validateObject的考验而已。考验的结果决定了这个对象是应该拿去作passivateObject处理,而后留待重用;还是应该拿去作destroyObject处理,以免占用资源。也就是说,当出借少于归还的时候,并不会额外发生什么特别的事情(当然,有可能因为该对象池处于不接受归还对象的请求的状态而抛出异常,不过这是常规现象)。 在实际使用中,可以利用这一特性来向对象池内加入通过其它方法生成的对象。 有时候可能要在多线程环境下使用Pool组件,这时候就会遇到和Pool组件的线程安全程度有关的问题。 因为ObjectPool和KeyedObjectPool都是在org.apache.commons.pool中定义的接口,而在接口中无法使用“synchronized”来修饰方法,所以,一个ObjectPool/KeyedObjectPool下的各个方法是否是同步方法,完全要看具体的实现。而且,单纯地使用了同步方法,也并不能使对象就此在多线程环境里高枕无忧。 就Pool组件中自带的几个ObjectPool/KeyedObjectPool的实现而言,它们都在一定程度上考虑了在多线程环境中使用的情况。不过还不能说它们是完全“线程安全”的。 例如,这段代码有些时候就会有一些奇怪的表现,最后输出的结果比预期的要大: 要避免这种情况,就要进一步采取一些措施才行: 基本上,可以说Pool组件是线程相容的。但是要在多线程环境中使用,还需要作一些特别的处理。 采用对象池化的本意,是要通过减少对象生成的次数,减少花在对象初始化上面的开销,从而提高整体的性能。然而池化处理本身也要付出代价,因此,并非任何情况下都适合采用对象池化。 Dr. Cliff Click在JavaOne 2003上发表的《Performance Myths Exposed》中,给出了一组其它条件都相同时,使用与不使用对象池化技术的实际性能的比较结果。他的实测结果表明: 根据使用方法的不同,实际的情况可能与这一测量结果略有出入。在配置较高的机器和技术较强的虚拟机上,不宜池化的对象的范围可能会更大。不过,对于像网络和数据库连接这类重量级的对象来说,目前还是有池化的必要。 基本上,只在重复生成某种对象的操作成为影响性能的关键因素的时候,才适合进行对象池化。如果进行池化所能带来的性能提高并不重要的话,还是不采用对象池化技术,以保持代码的简明,而使用更好的硬件和更棒的虚拟机来提高性能为佳。 恰当地使用对象池化,可以有效地降低频繁生成某些对象所造成的开销,从而提高整体的性能。而借助Jakarta Commons Pool组件,可以有效地减少花在处理对象池化上的工作量,进而,向其它重要的工作里,投入更多的时间和精力。 孙海涛从1994年6月的一个风雨交加的下午开始了他的编程生涯。目前,他的兴趣集中于Java、Web、开源软件和人机交互。但是,这并不表示他不会对其它的事物给予足够的关心和重视。可以通过 alexhsun@hotmail.com与他取得联系。使用Jakarta Commons Pool处理对象池化
When to use sidebars
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) {
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);
}
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);
}
}
PoolableObjectFactory factory = new PoolableObjectFactorySample();
ObjectPool pool = new StackObjectPool(factory);
Object obj = null;
obj = pool.borrowObject();
pool.returnObject(obj);
pool.close();
ObjectPoolSample.java
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.StackObjectPool;
public class ObjectPoolSample {
public static void main(String[] args) {
Object obj = null;
PoolableObjectFactory factory
= new PoolableObjectFactorySample();
ObjectPool pool = new StackObjectPool(factory);
try {
for(long i = 0; i < 100 ; i++) {
System.out.println("== " + i + " ==");
obj = pool.borrowObject();
System.out.println(obj);
pool.returnObject(obj);
}
obj = null;//明确地设为null,作为对象已归还的标志
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try{
if (obj != null) {//避免将一个对象归还两次
pool.returnObject(obj);
}
pool.close();
}
catch (Exception e){
e.printStackTrace();
}
}
}
}
ObjectPoolFactorySample.java
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.ObjectPoolFactory;
import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.StackObjectPoolFactory;
public class ObjectPoolFactorySample {
public static void main(String[] args) {
Object obj = null;
PoolableObjectFactory factory
= new PoolableObjectFactorySample();
ObjectPoolFactory poolFactory
= new StackObjectPoolFactory(factory);
ObjectPool pool = poolFactory.createPool();
try {
for(long i = 0; i < 100 ; i++) {
System.out.println("== " + i + " ==");
obj = pool.borrowObject();
System.out.println(obj);
pool.returnObject(obj);
}
obj = null;
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try{
if (obj != null) {
pool.returnObject(obj);
}
pool.close();
}
catch (Exception e){
e.printStackTrace();
}
}
}
}
BasePoolableObjectFactorySample.java
import org.apache.commons.pool.BasePoolableObjectFactory;
public class BasePoolableObjectFactorySample
extends BasePoolableObjectFactory {
private int counter = 0;
public Object makeObject() throws Exception {
return String.valueOf(counter++);
}
}
KeyedObjectPoolSample.java
import org.apache.commons.pool.BaseKeyedPoolableObjectFactory;
import org.apache.commons.pool.KeyedObjectPool;
import org.apache.commons.pool.KeyedObjectPoolFactory;
import org.apache.commons.pool.KeyedPoolableObjectFactory;
import org.apache.commons.pool.impl.StackKeyedObjectPoolFactory;
class KeyedPoolableObjectFactorySample
extends BaseKeyedPoolableObjectFactory {
public Object makeObject(Object key) throws Exception {
return new String("[" + key.hashCode() + "]");
}
}
public class KeyedObjectPoolSample {
public static void main(String[] args) {
Object obj = null;
KeyedPoolableObjectFactory factory
= new KeyedPoolableObjectFactorySample();
KeyedObjectPoolFactory poolFactory
= new StackKeyedObjectPoolFactory(factory);
KeyedObjectPool pool = poolFactory.createPool();
String key = null;
try {
for (long i = 0; i < 100 ; i++) {
key = "" + (int) (Math.random() * 10);
System.out.println("== " + i + " ==");
System.out.println("Key:" + key);
obj = pool.borrowObject(key);
System.out.println("Object:" + obj);
pool.returnObject(key, obj);
obj = null;
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try{
if (obj != null) {
pool.returnObject(key, obj);
}
pool.close();
}
catch (Exception e){
e.printStackTrace();
}
}
}
}
UnsafeMultiThreadPoolingSample.java
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.StackObjectPool;
class UnsafePicker extends Thread {
private ObjectPool pool;
public UnsafePicker(ObjectPool op) {
pool = op;
}
public void run() {
Object obj = null;
try {
/* 似乎…… */
if ( pool.getNumActive() < 5 ) {
sleep((long) (Math.random() * 10));
obj = pool.borrowObject();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
public class UnsafeMultiThreadPoolingSample {
public static void main(String[] args) {
ObjectPool pool = new StackObjectPool
(new BasePoolableObjectFactorySample());
Thread ts[] = new Thread[20];
for (int j = 0; j < ts.length; j++) {
ts[j] = new UnsafePicker(pool);
ts[j].start();
}
try {
Thread.sleep(1000);
/* 然而…… */
System.out.println("NumActive:" + pool.getNumActive());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
SafeMultiThreadPoolingSample.java
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.StackObjectPool;
class SafePicker extends Thread {
private ObjectPool pool;
public SafePicker(ObjectPool op) {
pool = op;
}
public void run() {
Object obj = null;
try {
/* 略加处理 */
synchronized (pool) {
if ( pool.getNumActive() < 5 ) {
sleep((long) (Math.random() * 10));
obj = pool.borrowObject();
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
public class SafeMultiThreadPoolingSample {
public static void main(String[] args) {
ObjectPool pool = new StackObjectPool
(new BasePoolableObjectFactorySample());
Thread ts[] = new Thread[20];
for (int j = 0; j < ts.length; j++) {
ts[j] = new SafePicker(pool);
ts[j].start();
}
try {
Thread.sleep(1000);
System.out.println("NumActive:" + pool.getNumActive());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
发表评论
-
新公司新的环境 --- 开发环境说明
2013-10-17 05:37 973到了新公司,开发环境和原来的公司几乎不同,虽说开发环境不同简 ... -
Java中JSON解析器的一点见解
2013-08-15 17:25 1449最终采用了Jackson JSON ... -
npm设置代理 以及 重定向
2013-07-30 10:49 3653node.js通过npm安装模块,npm的代理设置法:npm ... -
windows7访问xp的共享目录
2013-07-18 20:17 2059新装了了一台win7,无法访问到xp的共享目录,怎么调都不行 ... -
Access restriction: The type XXX is not accessible due to restriction on require
2013-01-06 09:14 1120引用rt.jar中的一个类,结 ... -
JVM崩溃
2012-07-03 10:19 1651程序本来好好的, 做了一次大修改,测试的时候发现在某些场合下, ... -
关于泛型中<? extends A> 和 <? super A>的差别
2012-05-22 16:05 1201天下文章一大抄, 继续抄 来源: 百度上搜索&quo ... -
泛型类型的子类及通配符的使用
2012-05-22 15:30 1538最近碰到一个泛型的问题, 就在网上找技术贴, 挖坟挖出个08年 ... -
Calendar中的Time/isTimeSet
2012-05-03 14:15 1196在调试程序,在Eclipse的watch窗口,发现Cal ... -
Java中getResourceAsStream的用法
2012-02-14 10:12 1367Java中getResourceAsStream的用 ... -
Tomcat没有说支持WebSocket,只能用Jetty了
2012-01-18 11:11 1366Tomcat没有说支持WebSocket,只能用Jetty了 -
做网站需要注意的地方以及需要采用的技术、产品
2012-01-16 10:24 1185整个网站: 内容组织 1. 前台技术 ... -
【HTML】块级元素的盒子属性
2012-01-09 09:42 1746html中的块级元素:标记节、division、标题、段落、列 ... -
CSS几种定义方式
2012-01-09 09:26 18611. 针对标记的定义: <style ty ... -
HTML中的注释
2012-01-09 09:05 1322在HTML中的注释是 <!-- --> ... -
jBPM4.4+SpringSecurity用户合并到自己体系中来
2011-12-30 10:53 3525jbPM4.4中的用户: 见:http://zybin ... -
【】ActiveX回调JS函数
2011-11-03 14:11 1994控件回调JS函数 http://blog.163 ... -
【xml】在页面中使用XML同步对象
2011-10-31 10:30 1246在页面中,需要获得XML数据,这个数据有控件进行获取,为了保证 ... -
【xml】SchemaLocation、import、include
2011-10-27 16:27 3199在xml中,定义了namespace,如果要验证xml文档的有 ... -
eXtremeDB微秒级实时数据库简介
2011-10-26 13:47 1646eXtremeDB微秒级实时数据库简介 eXtreme ...
相关推荐
Apache Commons Pool的核心概念是对象池,它提供了一种机制,使得开发者可以定义一个对象工厂,用于创建和初始化对象,然后在需要时从池中获取,用完后归还回池,而不是直接销毁。这种方式提高了系统的效率,尤其是...
总的来说,`commons-pool2-2.4.2.jar` 是MyBatis二级缓存与Redis集成的关键组件,通过提供对象池化服务,优化了Redis连接的管理,提高了整体系统的效率和响应速度。了解并正确配置Apache Commons Pool2,有助于...
`Commons Pool 2`是一个通用的对象池服务,允许开发者创建自己的对象池,以实现资源的复用,减少系统性能损耗。在Jedis中,我们可以结合`Commons Pool 2`来管理Jedis实例,避免频繁的实例化和释放。 集成`Commons ...
7. **应用场景**:Apache Commons Pool 2 广泛应用于数据库连接池(如HikariCP、C3P0等)、线程池(如Java的ExecutorService)以及其他需要复用对象的场景,如HTTP连接池、缓存对象池等。 总结来说,Apache Commons...
`commons-pool.jar`是Apache Commons的一个组件,全称为Apache Commons Pool,它提供了一种对象池化机制。对象池化是一种优化资源管理的技术,通过复用已创建的对象来减少对象的创建和销毁过程,从而提高系统性能。...
Apache Commons Pool2是Java开发的一个对象池库,它提供了对对象池模式的实现,以便高效地管理和重用有限资源。在本案例中,`commons-pool2-2.2-bin.zip` 是Apache Commons Pool 2.2版本的二进制发布包,用于配置...
Jedis是Java编程语言中广泛使用的Redis客户端,而Apache Commons Pool2则是一个对象池实现,用于有效地管理资源,如数据库连接或在本例中,Jedis实例。 **Jedis 3.2.0** 是一个重要的Redis客户端,提供了与Redis...
对象池的概念是预先创建并缓存一组对象,以便当需要时可以立即使用,而不是每次请求时都创建新对象。这大大提高了性能,减少了系统资源的消耗,尤其是在频繁创建和销毁对象的场景中,如数据库连接。 Apache Commons...
Apache Commons Pool是Apache软件基金会的一个项目,提供了对象池化的实现,广泛应用于数据库连接池、网络连接池等场景。在Jedis中,Commons Pool 2.4.2用于实现连接池管理,提高并发性能和资源利用率。 1. **对象...
Apache Commons Pool 提供了一种解决方案,通过维护一个对象池来缓存对象,当需要时可以从池中获取,使用完毕后归还到池中,而不是直接销毁。这样可以显著减少对象的创建和销毁次数,降低系统的内存开销和GC压力。 ...
`commons-pool2-2.4.2.jar`是Apache Commons Pool 2的实现,这是一个对象池设计模式的库。对象池是用于管理资源,如数据库连接或线程,以提高性能和效率的机制。在Java中,当频繁创建和销毁对象时,这可能导致大量的...
`commons-pool-1.4.jar` 是Apache Commons项目中的对象池库,它是DBCP依赖的基础,用于创建和管理对象池,包括数据库连接池。DBCP利用了这个库的功能来管理其内部的数据库连接。Apache Commons Pool提供了基础框架...
而`commons-pool2-2.4.3.jar`是Apache Commons Pool 2的库,它是Java对象池设计模式的一个实现。对象池设计模式旨在提高性能,通过重用已经创建的对象而不是每次需要时都创建新的对象,从而减少系统资源的消耗。在...
首先,`commons-pool2-2.6.2.jar` 是 Apache Commons Pool 的第二版,这是一个通用的对象池服务。对象池的概念是创建一组预先初始化的对象并重复使用它们,以减少频繁创建和销毁对象带来的性能开销。Apache Commons ...
为了避免重新造轮子,我们可以使用优秀的开源对象池化组件apache-commons-pool2,它对对象池化操作进行了很好的封装,我们只需要根据自己的业务需求重写或实现部分接口即可,使用它可以快速的创建一个方便,简单,...
Apache Commons Pool 是一个Java对象池库,它的主要目标是提供一种高效的、可扩展的对象池服务。在2.2版本中,这个库提供了更加完善的对象池管理机制,使得开发者能够更方便地管理和复用对象,从而提高系统的性能和...
Apache Commons Pool 是一个开源的Java对象池库,它允许开发者创建和管理一组可重用对象的池。在标题中提到的“commons-pool-1.3”是该库的一个特定版本,发布于2006年,是Apache Commons项目的一部分。Apache ...
而`commons-pool2-2.0.jar`则是Apache Commons Pool的第二版,一个对象池服务,用于管理Jedis实例,提升性能和资源利用率。 **Jedis简介** Jedis是Java开发的Redis客户端,其功能强大且易于使用。它支持所有Redis...
`commons-pool.jar`是Apache Commons Pool项目的一部分,它提供了一个通用的对象池服务。对象池设计用于管理和重用昂贵资源,如数据库连接或网络套接字。在Jedis中,Apache Commons Pool被用来管理Redis连接,通过...
**标题与描述解析** 标题"jedis-2.9.0.jar和commons-pool2-2.6.0.jar下载...通过理解和正确使用Jedis及Apache Commons Pool,Java开发者可以高效地与Redis数据库进行交互,实现数据存储、检索和缓存等多种功能。