javaweb框架构想-自己的对象存储池-遁地龙卷风
设计初衷:
网站在提供服务的过程中,会创建很多对象,bean,dao层的对象尤为频繁,然而这些对象是可以重复利用的.
设计思路:
对象连接池ObjectPool才用单态的设计模式,自带线程,每隔一段时间调用该类的
clearObject方法,
为了保证同步,涉及线程安全的方法全都使用了synchronized关键字
每个方法的流程控制根据存储值会出现的状态,以及会影响存储值状态的数据决定
要存储进ObjectPool的类需要实现AllowEnterObjectPool接口
主要属性介绍:
HashMap<String,ArrayList> hashMapForStorageObject,key是包名+类名,value存储改类的实例,每次取出放回都会从0的位置
HashMap<String,Integer> hashMapForObjectUsedTime key是包名+类名+@+对象hashcode Integer记录了对象被取出次数
主要方法介绍:
takeOut的方法利用泛型,只需传给类的Class,便可返回对应类型,利用反射批量添加对象
put 是对象恢复到初始状态(由程序员指定),放入到对应ArrayList的0位置
clearObject,由内部线程调用,遍历hashMapForStorageObject每个ArrayList,如果ArrayList总数大于最小存储数,再去
ashMapForObjectUsedTime查找使用记录,将符合条件的对象删除,最后清零使用记录
代码及使用方式:
package myFrame; public interface AllowEnterObjectPool { public ObjectPool objectPool = ObjectPool.getInstance(); //将对象放入改类时,需调用改方法,将对象恢复带默认状态 public void initialMember(); //当调用takeOut方法,发现没有可用的对象使,会调用改方法批量加入 public void batchAddSelf(); }
package myFrame; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import com.sun.security.auth.NTDomainPrincipal; import Dao.TestDao; public class ObjectPool implements Debug,Assistant { //当只剩下30个对象的时候,就不进行删除行为了 private int minNumber = 30; //每隔多少时间进行检查 private int checkTime = 60*60*1000; //每个类对应一个ArrayList // key值已包名+类名的方式 // value值是存储该对象的Arraylist // value影响程序流程的值 null(没有找到key) 0(size) // 影响value的状态的值 minNumber private HashMap<String,ArrayList> hashMapForStorageObject = new HashMap<String, ArrayList>(); //每个对象对应一个Integer,记录一段时间内被调用得次数 /* * key值已包名+类名+@+对象hashcode value 记录了该对象被取出的次数 value影响程序流程的值 null(没有找到key) >0(被使用过) */ private HashMap<String,Integer> hashMapForObjectUsedTime = new HashMap<String, Integer>(); private static ObjectPool objectPool = new ObjectPool(); private ObjectPool() { new clock().start(); } //得到一个类的实例,每次都从0获取,并从ArrayList中删除 public<T> T takeOut(Class<T> object) { synchronized (this) { String className = object.getName(); ArrayList<T> objectList = hashMapForStorageObject.get(className); if(objectList == null) { objectList = new ArrayList<T>(); hashMapForStorageObject.put(className,objectList); T createObject = null; try { createObject = object.newInstance(); Method batchAddSelf = object.getMethod("batchAddSelf"); batchAddSelf.invoke(createObject); objectList.add(createObject); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else if(objectList.size()==0) { T createObject = null; try { createObject = object.newInstance(); Method batchAddSelf = object.getMethod("batchAddSelf"); batchAddSelf.invoke(createObject); objectList.add(createObject); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } T returnObject = objectList.get(0); String flag = className+"@"+Integer.toHexString(returnObject.hashCode()); Integer i = hashMapForObjectUsedTime.get(flag); if(i == null) { i = 0; } hashMapForObjectUsedTime.put(flag,++i); objectList.remove(returnObject); return returnObject; } } /* * 将对象恢复到初始状态后,放入0位置 */ public synchronized void put(AllowEnterObjectPool allowEnterObjectPool) { allowEnterObjectPool.initialMember(); String className = allowEnterObjectPool.getClass().getName(); ArrayList objectList = hashMapForStorageObject.get(className); if(objectList == null) { objectList = new ArrayList(); hashMapForStorageObject.put(className,objectList); } objectList.add(0,allowEnterObjectPool); } /* * 已hashMapForStorageObject为准,取出一个ArrayList A,遍历里面的对象,例如对a ,组成hashMapForObjectUsedTime的key值 * 当A的容量大于minnumber时,则通过key查找hashMapForObjectUsedTime,得到value为null的话,则删除A里面的对应对象 * 将hashMapForObjectUsedTime数据清除 */ public synchronized void clearObject() { Iterator<String> iterator = hashMapForStorageObject.keySet().iterator(); String key,flag; ArrayList list; while (iterator.hasNext()) { key = iterator.next(); list = hashMapForStorageObject.get(key); Object object; Integer usedTime; if (list.size()<minNumber) { continue; } for(int i=0;i<list.size();i++) { object = list.get(i); flag = key+"@"+Integer.toHexString(object.hashCode()); usedTime = hashMapForObjectUsedTime.get(flag); if(usedTime == null) { list.remove(i); hashMapForObjectUsedTime.remove(key); i--; if(list.size() == minNumber) break; } } } hashMapForObjectUsedTime.clear(); } public static ObjectPool getInstance() { return objectPool; } private class clock extends Thread { @Override public void run() { System.out.println("时钟启动"); while(true) { try { Thread.sleep(checkTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } clearObject(); } } } public static void main(String[] args) { Message message = objectPool.takeOut(Message.class); objectPool.put(message); System.out.println(message); } }
package myFrame; public class Message implements AllowEnterObjectPool { private String name; private int age; public Message() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public void initialMember() { // TODO Auto-generated method stub name = ""; age = 0; } @Override public void batchAddSelf() { Message message; for(int i=0;i<10;i++) { message = new Message(); objectPool.put(message); } } }
javaweb框架构想-自己的对象存储池-遁地龙卷风的更多相关文章
- MyBatis框架在控制台打印Sql语句-遁地龙卷风
第二版 (-1)写在前面 我用的是MyBatis 3.2.4,Maven Project (0)mybatis-config.xml <settings> <setting name ...
- JavaWeb框架的基石
JavaWeb框架的基石(一) 初学JavaWeb开发,请远离各种框架,从Servlet开始. Web框架是开发者在使用某种语言编写Web应用服务端是关于架构的最佳实践.很多Web框架 ...
- selenium测试框架使用xml作为对象库
之前已经写过一篇: selenium测试框架篇,页面对象和元素对象的管理 上次使用的excel作为Locator对象管理,由于excel处理不够方便,有以下缺点: 不能实现分page 加载Locato ...
- selenium测试框架篇,页面对象和元素对象的管理
前期已经做好使用Jenkins做buildhttp://www.cnblogs.com/tobecrazy/p/4529399.html 做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让 ...
- (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象
在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...
- (转载)OC学习篇之---Foundation框架中的NSObject对象
前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...
- “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象
目录: “Zhuang.Data”轻型数据库访问框架(一)开篇介绍 “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象 先来看一段代码 DbAccessor dba ...
- Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite
Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...
- Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
随机推荐
- 我总结的js性能优化的小知识
前言 一直在学习javascript,也有看过<犀利开发Jquery内核详解与实践>,对这本书的评价只有两个字犀利,可能是对javascript理解的还不够透彻异或是自己太笨,更多的是自己 ...
- JavaScript中局部变量与全局变量的不同
JavaScript中局部变量与全局变量 我们知道,JavaScript的变量是松散型的变量,也就是说,其变量只需用var声明,其赋值的类型是不限定的.比如: var person=18; perso ...
- Nginx个人简单理解
首先我们来补充下一些基本知识: 什么是代理服务器? 先举个简单的例子,现在我们在百度访问谷歌的网站,发现现在进不去,这个时候我们可以FQ(关于FQ,可以借鉴下这个博文:http://zhangge.n ...
- 记一次mysql故障恢复
事情要从俩月前的一个坑说起,一台新的测试服务器,新项目一元夺宝用的. 配置aws上的一台云主机,系统盘8G,一块300G的云硬盘. 拿到机器后,另一运维小哥安装php,nginx,mysql等软件. ...
- js 处理日期 看着比较全,备用
http://www.cnblogs.com/endora/archive/2012/12/06/endorahe.html js 处理日期 看着比较全,备用
- JavaWeb学习笔记——开发动态WEB资源(七)bookapp
该工程的功能是实现一个bookapp 1.开发注册页面,注册使用properties文件,存储在classpath跟路径 2.注册成功跳转到登录页面 3.输入用户名密码登录,登录成功跳转到book显示 ...
- Ad-Hoc命令不熟悉的选项
-f #并发线程数,默认5个线程 --private-key #指定秘钥文件 -k #--ask-pass SSH:认证密码 -K, #--ask-sudo-pass sudo:用户的密码(--sud ...
- xmanager远程桌面连接Linux
远程桌面连接Linux,两种工具:vnc.xmanager xmanager使用参考如下,暂未整理: Xmanager连接Centos的远程桌面 | 大爱 http://lovesoo.org/xma ...
- Request.GetOwinContext()打不到
Although it's in the Microsoft.Owin.Host.SystemWeb assembly it is an extension method in the System. ...
- vs2013 支持C#6.0 Install-Package Microsoft.Net.Compilers
vs2013 支持C#6.0 Install-Package Microsoft.Net.Compilers