设计初衷:
  网站在提供服务的过程中,会创建很多对象,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. Character literal must contain exactly one character -- 一天一点小知识

    编程语言高度抽象化以后,错误也越来越让人难以理解了, NET编程最常见的一个错误, Object not set to the reference ,过了好久,才明白过来, 就是不明白为啥微软不说   ...

  2. webservice理解

    什么是webservice? 1.基于web的一种服务,webservice分为服务器端server和客户端client. server端会会提供一些资源供客户端的应用来访问(获取所需要的数据) 2. ...

  3. BZOJ2827: 千山鸟飞绝

    离散化坐标,每个坐标开一棵以鸟的编号为关键字的平衡树.每次插入时打2个标记,同时更新自身.这个方法比较显然,而且好写.正解好像用很迷的方法乱搞了一波,然后用线段树不打标记就做出来了,并不会. trea ...

  4. 功能完善的Java连接池调用实例

    /** * Title: ConnectPool.java * Description: 连接池管理器 * Copyright: Copyright © 2002/12/25 * Company: * ...

  5. WinForm------点击Control弹出MessageBox

    private void barButtonItem3_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { //弹 ...

  6. php5.1以上版本时间戳_时间戳与日期格式转换_相差8小时 的解决方案

    php5.1以上时间戳会与实际时间相差8小时,解决办法如下 .最简单的方法就是不要用php5.1以上的版本--显然这是不可取的方法!!! .修改php.ini.打开php.ini查找date.time ...

  7. my.conf 配置编码为utf-8

    MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. M ...

  8. ctypes 操作 python 与 c++ dll 互传结构体指针

    CMakeLists.txt # project(工程名) project(blog-3123958139-1) # add_library(链接库名称 SHARED 链接库代码) add_libra ...

  9. 安装php时的配置选项

    ./configure --prefix=/home/samba/anthony/web --enable-mbstring --enable-fastcgi --enable-fpm --with- ...

  10. Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

    Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast的解决方法: 在命令行输入:yum clean al ...