设计初衷:
  网站在提供服务的过程中,会创建很多对象,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框架构想-自己的对象存储池-遁地龙卷风的更多相关文章

  1. MyBatis框架在控制台打印Sql语句-遁地龙卷风

    第二版 (-1)写在前面 我用的是MyBatis 3.2.4,Maven Project (0)mybatis-config.xml <settings> <setting name ...

  2. JavaWeb框架的基石

    JavaWeb框架的基石(一) 初学JavaWeb开发,请远离各种框架,从Servlet开始.         Web框架是开发者在使用某种语言编写Web应用服务端是关于架构的最佳实践.很多Web框架 ...

  3. selenium测试框架使用xml作为对象库

    之前已经写过一篇: selenium测试框架篇,页面对象和元素对象的管理 上次使用的excel作为Locator对象管理,由于excel处理不够方便,有以下缺点: 不能实现分page 加载Locato ...

  4. selenium测试框架篇,页面对象和元素对象的管理

    前期已经做好使用Jenkins做buildhttp://www.cnblogs.com/tobecrazy/p/4529399.html 做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让 ...

  5. (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象

    在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...

  6. (转载)OC学习篇之---Foundation框架中的NSObject对象

    前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...

  7. “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象

    目录: “Zhuang.Data”轻型数据库访问框架(一)开篇介绍 “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象 先来看一段代码 DbAccessor dba ...

  8. Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

    Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...

  9. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

随机推荐

  1. 高可用与负载均衡(1)之linux系统的数据链路层负载均衡

    preface 在蓝厂就职到时候,每台缓存服务器都能够跑到2G的流量,这么大的流量,有人会问,服务器是不是安装的万兆网卡,no no no,仅仅是3张千兆网卡绑定在一块.万兆网卡的服务器少见,大多数都 ...

  2. 什么是jsonp

    Jsonp其实就是一个跨域解决方案. Js跨域请求数据是不可以的,但是js跨域请求js脚本是可以的. 所以可以把要请求的数据封装成一个js语句,做一个方法的调用. 跨域请求js脚本可以得到此脚本.得到 ...

  3. js012-DO2和DOM3

    js012-DO2和DOM3 本章内容: DOM2和DOM3的变化 操作样式的ODM API DOM 遍历与范围 DOM2级核心:在一级核心基础上构建,为节点添加了更多方法和属性 DOM2级视图:为文 ...

  4. Jquery 实现密码框的显示与隐藏【转载自http://blog.csdn.net/fengzhishangsky/article/details/11809069】

    <html> <head>  <script type="text/JavaScript"  src="jQuery-1.5.1.min.j ...

  5. C#--使用存储过程

    过程: 1.连接数据库 2.设置执行类型为存储过程,区别于SQL语句 3.得到执行结果,返回值.输出参数等 //连接数据库 string connstr = "Data Source=ZGC ...

  6. 如何使Python完美升级到新版本

    这里提供一种解决的方法 (加上一句话,发现一个新问题:这种方法yum update 后,需要将/usr/bin下的python文件删除,然后执行: # ln -s /usr/local/python2 ...

  7. 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 ...

  8. python版本升级及pip部署方法

    Python版本升级 CentOS 6.3自带的Python版本为2.6,首先需要升级到2.7版本.由于旧版本的Python已被深度依赖,所以不能卸载原有的Python,只能全新安装. 1.下载Pyt ...

  9. SSLv3 Poodle攻击漏洞检测工具

    漏洞编号:CVE-2014-3566 POC如下: import ssl,socket,sys SSL_VERSION={    'SSLv2':ssl.PROTOCOL_SSLv2,    'SSL ...

  10. 在VS2013中强制IIS Express应用程序池使用经典模式

    直接在文件夹地址栏输入 %userprofile%\documents\iisexpress\config\applicationhost.config 会打开上边的配置文件 将 <siteDe ...