博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apache Commons Pool试用小记
阅读量:5769 次
发布时间:2019-06-18

本文共 7804 字,大约阅读时间需要 26 分钟。

相比众多牛人的自己连接池,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.可以通过 来配置。
 
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/217547,如需转载请自行联系原作者
你可能感兴趣的文章
Microsoft Exchange Server 2010与Office 365混合部署升级到Exchange Server 2016混合部署汇总...
查看>>
Proxy服务器配置_Squid
查看>>
【SDN】Openflow协议中对LLDP算法的理解--如何判断非OF区域的存在
查看>>
纯DIV+CSS简单实现Tab选项卡左右切换效果
查看>>
redis 常用命令
查看>>
EdbMails Convert EDB to PST
查看>>
android 资源种类及使用
查看>>
Centos7同时运行多个Tomcat
查看>>
使用CocoaPods过程中的几个问题
查看>>
我的友情链接
查看>>
为eclipse安装maven插件
查看>>
JAVA8 Stream 浅析
查看>>
inner join on, left join on, right join on要详细点的介绍
查看>>
SAS vs SSD对比测试MySQL tpch性能
查看>>
Spring boot 整合CXF webservice 全部被拦截的问题
查看>>
Pinpoint跨节点统计失败
查看>>
机房带宽暴涨问题分析及解决方法
查看>>
XP 安装ORACLE
查看>>
八、 vSphere 6.7 U1(八):分布式交换机配置(vMotion迁移网段)
查看>>
[转载] 中华典故故事(孙刚)——19 万岁
查看>>