Apache Commons Pool试用小记

简介:
相比众多牛人的自己连接池,Apache的Pool就是牛中的大牛了,这里小试一把。
 
环境:
commons-pool-1.5.3-bin.zip
jdk1.5
 
 
一、基本String对象测试
 
import org.apache.commons.pool.impl.GenericKeyedObjectPool; 
import org.apache.commons.pool.BaseKeyedPoolableObjectFactory; 

/** 
* Created by IntelliJ IDEA. 

* @author leizhimin 2009-10-27 17:46:18 
*/
 
public  class Test { 
         public  static  void main(String[] args)  throws Exception { 
                 //创建一个对象池 
                GenericKeyedObjectPool pool =  new GenericKeyedObjectPool( new BaseKeyedPoolableObjectFactory() { 
                        @Override 
                         public Object makeObject(Object o)  throws Exception { 
                                 return o; 
                        } 
                }); 

                 //添加对象到池,重复的不会重复入池 
                pool.addObject( "a"); 
                pool.addObject( "a"); 
                pool.addObject( "b"); 
                pool.addObject( "x"); 

                 //清除最早的对象 
                pool.clearOldest(); 

                 //获取并输出对象 
                System.out.println(pool.borrowObject( "a")); 
                System.out.println(pool.borrowObject( "b")); 
                System.out.println(pool.borrowObject( "c")); 
                System.out.println(pool.borrowObject( "c")); 
                System.out.println(pool.borrowObject( "a")); 

                 //输出池状态 
                System.out.println(pool.getMaxIdle()); 
                System.out.println(pool.getMaxActive()); 

        } 
}
 
输出结果:








Process finished with exit code 0
 
当运行到清除最早对象一行,内存状态如下:
 
 
初略看看,Apache Commons pool功能还很强大,DBCP数据库连接池就用了它,还可以对其进行参数配置。
 
二、自定义复杂对象测试
 
import org.apache.commons.pool.impl.GenericKeyedObjectPool; 
import org.apache.commons.pool.BaseKeyedPoolableObjectFactory; 

/** 
* Created by IntelliJ IDEA. 

* @author leizhimin 2009-10-27 17:46:18 
*/
 
public  class Test { 
         public  static  void main(String[] args)  throws Exception { 
                 //创建一个对象池 
                GenericKeyedObjectPool pool =  new GenericKeyedObjectPool( new BaseKeyedPoolableObjectFactory() { 
                        @Override 
                         public Object makeObject(Object o)  throws Exception { 
                                 if (o !=  null && o  instanceof User) 
                                         return o; 
                                 else 
                                         return  null
                        } 
                }); 

                 //添加对象到池,重复的不会重复入池 
                pool.addObject( "a"); 
                pool.addObject( "b"); 
                pool.addObject( "x"); 
                pool.addObject( null); 
                pool.addObject( null); 
                pool.addObject( null); 
                pool.addObject( new User( "zhangsan""123")); 
                pool.addObject( new User( "lisi""112")); 
                pool.addObject( new User( "lisi""112", 32)); 
                pool.addObject( new User( "lisi""112", 32,  "一个烂人!")); 


                 //清除最早的对象 
                pool.clearOldest(); 

                 //获取并输出对象 
                User u1 =  new User( "lisi""112", 32,  "一个烂人!"); 
                System.out.println(pool.borrowObject(u1)); 
                pool.returnObject(u1,u1); 

                 //获取并输出对象 
                User u2 =  new User( "lisi""112", 32,  "一个烂人!"); 
                System.out.println(pool.borrowObject(u2)); 
                pool.returnObject(u2,u2); 

                 //获取并输出对象 
                User u3 =  new User( "lisi""112", 32); 
                System.out.println(pool.borrowObject(u3)); 
                pool.returnObject(u3,u3); 

                 //获取并输出对象 
                User u4 =  new User( "lisi""112"); 
                System.out.println(pool.borrowObject(u4)); 
                pool.returnObject(u4,u4); 

                System.out.println(pool.borrowObject(u4)); 
                pool.returnObject(u4,u4); 
                System.out.println(pool.borrowObject(u4)); 
                pool.returnObject(u4,u4); 
                System.out.println(pool.borrowObject(u4)); 
                pool.returnObject(u4,u4); 
                System.out.println(pool.borrowObject(u4)); 
                pool.returnObject(u4,u4); 
                System.out.println(pool.borrowObject(u4)); 
                pool.returnObject(u4,u4); 
                System.out.println(pool.borrowObject(u4)); 
                pool.returnObject(u4,u4); 
                System.out.println(pool.borrowObject(u4)); 
                pool.returnObject(u4,u4); 





                System.out.println(pool.borrowObject( new User( "lisi""112"))); 
//                System.out.println(pool.borrowObject(new User("lisi", "112"))); 

                 //输出池状态 
                System.out.println(pool.getMaxIdle()); 
                System.out.println(pool.getMaxActive()); 
                pool.clearOldest(); 
                pool.close(); 

        } 


class User { 
         private String name; 
         private String pswd; 
         private  int age; 
         private String reamark; 

        User() { 
        } 

        User(String name, String pswd) { 
                 this.name = name; 
                 this.pswd = pswd; 
        } 

        User(String name, String pswd,  int age) { 
                 this.name = name; 
                 this.pswd = pswd; 
                 this.age = age; 
        } 

        User(String name, String pswd,  int age, String reamark) { 
                 this.name = name; 
                 this.pswd = pswd; 
                 this.age = age; 
                 this.reamark = reamark; 
        } 

         public String getName() { 
                 return name; 
        } 

         public  void setName(String name) { 
                 this.name = name; 
        } 

         public String getPswd() { 
                 return pswd; 
        } 

         public  void setPswd(String pswd) { 
                 this.pswd = pswd; 
        } 

         public  int getAge() { 
                 return age; 
        } 

         public  void setAge( int age) { 
                 this.age = age; 
        } 

         public String getReamark() { 
                 return reamark; 
        } 

         public  void setReamark(String reamark) { 
                 this.reamark = reamark; 
        } 

        @Override 
         public  boolean equals(Object o) { 
                 if ( this == o)  return  true
                 if (o ==  null || getClass() != o.getClass())  return  false

                User user = (User) o; 

                 if (!name.equals(user.name))  return  false
                 if (!pswd.equals(user.pswd))  return  false

                 return  true
        } 

        @Override 
         public  int hashCode() { 
                 int result = name.hashCode(); 
                result = 31 * result + pswd.hashCode(); 
                 return result; 
        } 

        @Override 
         public String toString() { 
                 return  "User{" + 
                                 "name='" + name + '\'' + 
                                 ", pswd='" + pswd + '\'' + 
                                 ", age=" + age + 
                                 ", reamark='" + reamark + '\'' + 
                                '}'; 
        } 
}
 
测试结果:
User{name='lisi', pswd='112', age=32, reamark=' null'} 
User{name='lisi', pswd='112', age=32, reamark='一个烂人!'} 
User{name='lisi', pswd='112', age=32, reamark='一个烂人!'} 
User{name='lisi', pswd='112', age=32, reamark=' null'} 
User{name='lisi', pswd='112', age=0, reamark=' null'} 
User{name='lisi', pswd='112', age=0, reamark=' null'} 
User{name='lisi', pswd='112', age=0, reamark=' null'} 
User{name='lisi', pswd='112', age=0, reamark=' null'} 
User{name='lisi', pswd='112', age=0, reamark=' null'} 
User{name='lisi', pswd='112', age=0, reamark=' null'} 
User{name='lisi', pswd='112', age=0, reamark=' null'} 
User{name='lisi', pswd='112', age=0, reamark=' null'} 



Process finished with exit code 0
 
内存状态:
 
 
这次测试得出一些有用的结论:
1、复杂对象应该实现equals() 、hashCode()方法,以便不重复入池。
2、对于非入池的目标对象,比如a、b、x字符串,目前没有有效的办法过滤掉,不让其入池,虽然在工厂方法里做了努力。
3、试图将null入池,不会成功的,但也不抛异常。
4、对于池对象,使用应该遵循“接而有还,再借不难”-----从池中获取,不用时候归池,否则当池中没有空闲可用的对象时候,程序会处于等待状态,如果没有显式的调用归还方法,则造成程序死锁。
 
三、使用GenericObjectPool
 
import org.apache.commons.pool.impl.GenericObjectPool; 
import org.apache.commons.pool.BasePoolableObjectFactory; 

import java.util.Random; 

/** 
* Created by IntelliJ IDEA. 

* @author leizhimin 2009-10-28 10:51:11 
*/
 
public  class Test2 { 
         public  static  void main(String[] args)  throws Exception { 
                GenericObjectPool pool =  new GenericObjectPool( new BasePoolableObjectFactory() { 
                         public Object makeObject()  throws Exception { 
                                 return  new Random().nextFloat(); 
                        } 
                }); 

                pool.addObject(); 
                pool.addObject(); 
                pool.addObject(); 
                pool.addObject(); 
                pool.addObject(); 
                pool.addObject(); 
                pool.addObject(); 
                pool.addObject(); 
                pool.addObject(); 
                pool.addObject(); 
                pool.addObject(); 
                pool.addObject(); 

                Object o = pool.borrowObject(); 
                System.out.println(o); 
                pool.returnObject(o); 

                Object o1 = pool.borrowObject(); 
                System.out.println(o1); 

                Object o2 = pool.borrowObject(); 
                System.out.println(o2); 

                Object o3 = pool.borrowObject(); 
                System.out.println(o3); 

                Object o4 = pool.borrowObject(); 
                System.out.println(o4); 


                Object o5 = pool.borrowObject(); 
                System.out.println(o5); 


                Object o6 = pool.borrowObject(); 
                System.out.println(o6); 

                Object o7 = pool.borrowObject(); 
                System.out.println(o7); 

                Object o8 = pool.borrowObject(); 
                System.out.println(o8); 

                pool.returnObject(o1); 
                pool.returnObject(o2); 
                pool.returnObject(o3); 
                pool.returnObject(o4); 
                pool.returnObject(o5); 
                pool.returnObject(o6); 
                pool.returnObject(o7); 
                pool.returnObject(o8); 

                Object o9 = pool.borrowObject(); 
                System.out.println(o9); 
                pool.returnObject(o9); 

                Object o10 = pool.borrowObject(); 
                System.out.println(o10); 
                pool.returnObject(o10); 

                Object o11 = pool.borrowObject(); 
                System.out.println(o11); 
                pool.returnObject(o11); 

                Object o12 = pool.borrowObject(); 
                System.out.println(o12); 
                pool.returnObject(o12); 

                Object o13 = pool.borrowObject(); 
                System.out.println(o13); 
                pool.returnObject(o13); 

        } 
}
 
输出:
0.7358789 
0.7358789 
0.15324193 
0.7465391 
0.7198403 
0.7477861 
0.37906575 
0.049714446 
0.9650687 
0.9650687 
0.9650687 
0.9650687 
0.9650687 
0.9650687 

Process finished with exit code 0
 
从内存状态看到,这种对象池,没法将指定的对象入池,只能通过工厂生成对象入池,而且无法给工厂传递参数。
这种池适合数据库连接池等,所有的池对象拿出来都一样用。
 
经过上面三个例子综合测试得知,池的大小是初始化配置的,在没有显式配置指定的情况下,池大小默认为8.可以通过 GenericKeyedObjectPool.Config来配置。
 


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/217547,如需转载请自行联系原作者
相关文章
|
Apache
java.lang.NoClassDefFoundError: org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream
java.lang.NoClassDefFoundError: org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream
644 0
|
Java Apache Maven
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
1358 0
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
|
6月前
|
Java 数据库连接 Apache
深入理解Apache Commons Pool2池化技术
深入理解Apache Commons Pool2池化技术
|
7月前
|
算法 Java Apache
Apache Commons
Apache Commons是一个开源项目,提供了一系列的工具和库,用于简化Java开发中的常见任务。
72 1
|
移动开发 前端开发 Java
Spring MVC-09循序渐进之文件上传(基于Apache Commons FileUpload)
Spring MVC-09循序渐进之文件上传(基于Apache Commons FileUpload)
109 0
|
Java 应用服务中间件 Apache
nested exception is java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntim
nested exception is java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntim
368 0
|
Java Apache
java.lang.NoClassDefFoundError:org/apache/commons/logging/LogFactory
java.lang.NoClassDefFoundError:org/apache/commons/logging/LogFactory
114 0
|
存储 Java Apache
java积累——apache commons fileupload 实现文件上传
java积累——apache commons fileupload 实现文件上传
388 0
|
Apache
Apache Commons DbUtils工具使用
Apache Commons DbUtils工具使用
155 0
Apache Commons DbUtils工具使用
|
存储 JSON Java
【小家java】Java实用数据结构Pair、MutablePair、ImmutablePair详解(推荐apache的commons组件提供)
【小家java】Java实用数据结构Pair、MutablePair、ImmutablePair详解(推荐apache的commons组件提供)

推荐镜像

更多