commons-pool对象池实现原理及使用(二)
来源:互联网 发布:数据有效性wps2016 编辑:程序博客网 时间:2024/05/19 22:48
纸上得来终觉浅,绝知此事要躬行,我们用Commons-pool-1.6来写一个我们自己的对象池。
类MyObject 为池对象
类MyPoolableObjectFactory 为池对象工厂
类MyObjectPool封装的一个对象池
/** * * @author yujie.wang * 测试类 */public class MyObject {private String name;// true 表明对象可用,false表明当前对象不可用private boolean isValidate;private String state ;private boolean passivateFlag;public MyObject(String name, boolean isValidate,String state){this.name = name;this.isValidate = isValidate;this.state = state;}public void sayHello(){System.out.println(name + " say hello world");}public boolean isPassivateFlag() {return passivateFlag;}public void setPassivateFlag(boolean passivateFlag) {this.passivateFlag = passivateFlag;}public String getState() {return state;}public void setState(String state) {this.state = state;}public String getName() {return name;}public void setName(String name) {this.name = name;}public boolean isValidate() {return isValidate;}public void setValidate(boolean isValidate) {this.isValidate = isValidate;}}
/** * * @author yujie.wang *池对象工厂 对象池会调用这个工厂操作我们的对象 比如创建 激活 验证 销毁 钝化 */public class MyPoolableObjectFactory extends BasePoolableObjectFactory<MyObject>{@Overridepublic void activateObject(MyObject arg0) throws Exception {// TODO Auto-generated method stubarg0.setState("i am ok");arg0.setValidate(true);System.out.println(arg0.getName() + " 对象已经激活");}/** * 归还对象时 如果调用validateObject 验证对象失败,或者连接池被关闭, * 又或者归还对象时连接池中空闲的对象数量大于等于MaxIdel * 若符合上述三种情况之一 都会调用这个方法销毁对象 * */@Overridepublic void destroyObject(MyObject arg0) throws Exception {// TODO Auto-generated method stubarg0.setState("i am done");arg0.setValidate(false);System.out.println(arg0.getName() + " 对象已经销毁");}/** * 对象池调用该方法 创建一个对象 */@Overridepublic MyObject makeObject() throws Exception {// TODO Auto-generated method stubMyObject obj = new MyObject("new obj", false, " i am new");return obj;}/** * 归还对象时 钝化对象 比如某些对象用完之后需要休眠一段时间 */@Overridepublic void passivateObject(MyObject arg0) throws Exception {// TODO Auto-generated method stubarg0.setPassivateFlag(true);System.out.println(arg0.getName() + " 钝化完成");}/** * testOnBorrow设置为true时,创建对象时调用该方法验证对象的有效性, * 如果无效直接抛出异常throw new Exception("ValidateObject failed"); * testOnReturn设置为true时,归还对象时 验证对象是否还有效 比如连接是否还在, * 如果无效了则不往对象池中放对象。 */@Overridepublic boolean validateObject(MyObject arg0) {// TODO Auto-generated method stubSystem.out.println(arg0.getName() + " 验证对象 "+ arg0.isValidate());return arg0.isValidate() ? true :false;}}
/** * * @author yujie.wang * 直接使用GenericObjectPool 来封装一个对象池组件 */public class MyObjectPool {private GenericObjectPool<MyObject> pool;public MyObjectPool(PoolableObjectFactory<MyObject> factory,MyObjectConfig config){pool = new GenericObjectPool<MyObject>(factory, config);}/** * 从对象池中返回一个对象 * @return */public MyObject borrowObject(){try {return pool.borrowObject();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}/** * 将已经使用过的对象返还到对象池 * @param obj */public void returnObject(MyObject obj){try {pool.returnObject(obj);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 使对象池中的obj对象无效 * @param obj */public void invalidateObject(MyObject obj){try {//内部调用了池对象工程的destroyObject方法pool.invalidateObject(obj);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 关闭连接池 */public void destory(){try {pool.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//这里通过继承GenericObjectPool.Config 这个内部类 来操作相关参数public static class MyObjectConfig extends GenericObjectPool.Config{ public MyObjectConfig(){setTestWhileIdle(true);setMinEvictableIdleTimeMillis(60000L);setTimeBetweenEvictionRunsMillis(30000L);setNumTestsPerEvictionRun(-1);}public int getMaxIdle() {return maxIdle;}public void setMaxIdle(int maxIdle) {this.maxIdle = maxIdle;}public int getMinIdle() {return minIdle;}public void setMinIdle(int minIdle) {this.minIdle = minIdle;}public int getMaxActive() {return maxActive;}public void setMaxActive(int maxActive) {this.maxActive = maxActive;}public long getMaxWait() {return maxWait;}public void setMaxWait(long maxWait) {this.maxWait = maxWait;}public byte getWhenExhaustedAction() {return whenExhaustedAction;}public void setWhenExhaustedAction(byte whenExhaustedAction) {this.whenExhaustedAction = whenExhaustedAction;}public boolean isTestOnBorrow() {return testOnBorrow;}public void setTestOnBorrow(boolean testOnBorrow) {this.testOnBorrow = testOnBorrow;}public boolean isTestOnReturn() {return testOnReturn;}public void setTestOnReturn(boolean testOnReturn) {this.testOnReturn = testOnReturn;}public boolean isTestWhileIdle() {return testWhileIdle;}public void setTestWhileIdle(boolean testWhileIdle) {this.testWhileIdle = testWhileIdle;}public long getTimeBetweenEvictionRunsMillis() {return timeBetweenEvictionRunsMillis;}public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;}public int getNumTestsPerEvictionRun() {return numTestsPerEvictionRun;}public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {this.numTestsPerEvictionRun = numTestsPerEvictionRun;}public long getMinEvictableIdleTimeMillis() {return minEvictableIdleTimeMillis;}public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;}public long getSoftMinEvictableIdleTimeMillis() {return softMinEvictableIdleTimeMillis;}public void setSoftMinEvictableIdleTimeMillis(long softMinEvictableIdleTimeMillis) {this.softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis;}}}
测试类:
/** * * @author yujie.wang *测试类 */public class TestMyObjectPool {public static void main(String[] args) {// TODO Auto-generated method stub//创建对象池MyObjectPool pool = new MyObjectPool(new MyPoolableObjectFactory(),getConfig());//从对象池中借出一个对象MyObject object = pool.borrowObject();object.sayHello();//object.setValidate(false);//归还对象System.out.println("***归还对象***");pool.returnObject(object);}/** * 配置对象池的相关参数 * @return */public static MyObjectPool.MyObjectConfig getConfig(){MyObjectPool.MyObjectConfig config = new MyObjectPool.MyObjectConfig();config.setMaxActive(10);config.setMaxIdle(5);config.setMinIdle(0);config.setTestOnBorrow(true);config.setTestOnReturn(true);return config;}}
执行代码运行结果如下:
new obj 对象已经激活new obj 验证对象 truenew obj say hello world***归还对象***new obj 验证对象 truenew obj 钝化完成
阅读全文
0 0
- commons-pool对象池实现原理及使用(二)
- commons-pool对象池实现原理及使用(一)
- 使用Jakarta Commons Pool处理对象池化(二)(zt)
- Apache commons-pool对象池原理分析
- Apache commons-pool对象池原理分析
- Apache commons-pool对象池原理分析
- Apache commons-pool对象池原理分析
- Apache commons-pool对象池原理分析
- Jakarta Commons Pool 对象池 使用,测试
- 对象池commons-pool
- commons-pool2和commons-pool对象池使用
- java对象池commons-pool-1.6详解(二)
- commons-pool对象池技术
- commons-pool对象池(2)---实现一个线程池
- org.apache.commons.pool---Apache的对象池实现。
- 使用Jakarta Commons Pool处理对象池化
- 使用Jakarta Commons Pool处理对象池化
- 使用Jakarta Commons Pool处理对象池化
- Jboss7发布项目
- 如何杀死linux-zombie僵尸进程
- MediaMetadataRetriever根据指定时间截取帧
- Eclipse+SDK+ADT Android开发环境搭建注意问题
- 欢迎使用CSDN-markdown编辑器
- commons-pool对象池实现原理及使用(二)
- 阻止点击事件冒泡,不让父级元素的点击事件响应
- 【Codeforces418D】Big Problems for Organizers
- LeetCode 68 Text Justification
- 获取电脑日期时间代码段
- Windows 无法启动 VMware Authorization Service 服务
- HDU
- 面试准备之最详细的Handler的使用、源码分析
- JavaScript 原型