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包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
随机推荐
- 高可用与负载均衡(1)之linux系统的数据链路层负载均衡
preface 在蓝厂就职到时候,每台缓存服务器都能够跑到2G的流量,这么大的流量,有人会问,服务器是不是安装的万兆网卡,no no no,仅仅是3张千兆网卡绑定在一块.万兆网卡的服务器少见,大多数都 ...
- 什么是jsonp
Jsonp其实就是一个跨域解决方案. Js跨域请求数据是不可以的,但是js跨域请求js脚本是可以的. 所以可以把要请求的数据封装成一个js语句,做一个方法的调用. 跨域请求js脚本可以得到此脚本.得到 ...
- js012-DO2和DOM3
js012-DO2和DOM3 本章内容: DOM2和DOM3的变化 操作样式的ODM API DOM 遍历与范围 DOM2级核心:在一级核心基础上构建,为节点添加了更多方法和属性 DOM2级视图:为文 ...
- Jquery 实现密码框的显示与隐藏【转载自http://blog.csdn.net/fengzhishangsky/article/details/11809069】
<html> <head> <script type="text/JavaScript" src="jQuery-1.5.1.min.j ...
- C#--使用存储过程
过程: 1.连接数据库 2.设置执行类型为存储过程,区别于SQL语句 3.得到执行结果,返回值.输出参数等 //连接数据库 string connstr = "Data Source=ZGC ...
- 如何使Python完美升级到新版本
这里提供一种解决的方法 (加上一句话,发现一个新问题:这种方法yum update 后,需要将/usr/bin下的python文件删除,然后执行: # ln -s /usr/local/python2 ...
- Why is applicationhost.config still being added to source control even thought it's in gitignore
Why is applicationhost.config still being added to source control even thought it's in gitignore g ...
- python版本升级及pip部署方法
Python版本升级 CentOS 6.3自带的Python版本为2.6,首先需要升级到2.7版本.由于旧版本的Python已被深度依赖,所以不能卸载原有的Python,只能全新安装. 1.下载Pyt ...
- SSLv3 Poodle攻击漏洞检测工具
漏洞编号:CVE-2014-3566 POC如下: import ssl,socket,sys SSL_VERSION={ 'SSLv2':ssl.PROTOCOL_SSLv2, 'SSL ...
- 在VS2013中强制IIS Express应用程序池使用经典模式
直接在文件夹地址栏输入 %userprofile%\documents\iisexpress\config\applicationhost.config 会打开上边的配置文件 将 <siteDe ...