我的KT库之—–对象池

我的KT库之—–对象池

了解或者认识KT:

http://www.cnblogs.com/kingthy/archive/2011/08/08/2130973.html

 

在项目中如何使用KT?

KT是一个库,所以将KT的dll文件引用到您的项目上即可使用KT里的函数功能。

 

本节将介绍大家认识KT库里的对象池和如何使用它们。KT里的对象池对象都存放在“KT.Core.ObjectPool“下,当你已在你的项目里引用了KT库后,则写下以下代码就可以使用到KT里的所有对象池了。

using KT.Core.ObjectPool;

 

先了解一下对象池 

对象池,顾名思义就是用于存储对象的池(汗-_-!!),在它的生命周期内维护着它里面的所有对象,确保在同一个生命周期内对象池里的数据的唯一性。当对象池被销毁时,它里面的所有对象也将跟着销毁。

 

它的接口定义:

/// <summary>
/// 对象池接口
/// </summary>
public interface IObjectPool : IDisposable
{
    /// <summary>
    /// 添加对象,如果已存在key,则更新旧值
    /// </summary>
    /// <param name="key">键值</param>
    /// <param name="value"></param>
    void Add(object key, object value);

    /// <summary>
    /// 判断是否存在某个对象
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    bool Contains(object key);

    /// <summary>
    /// 移除某个对象
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    bool Remove(object key);

    /// <summary>
    /// 返回某个对象,如果不存在则返回null
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    object Get(object key);

    /// <summary>
    /// 返回对象池中已存储的对象数量
    /// </summary>
    int Count { get; }

    /// <summary>
    /// 清空对象池
    /// </summary>
    void Clear();
}

 

目前在KT里实现了此接口的共有两个对象,如下:

kt_1

 

其中DictionaryObjectPool是采用Hashtable实现的对象池,用于向其它对象池提供基础服务。ObjectPoolBase则是一个抽象类,是其它对象池的基类。

 

对象池的种类

根据生命周期的不同,可分为不同种类的对象池,KT目前共有以下几种:

 

A、WebApplicationObjectPool: 基于ASP.NET 应用程序的对象池

     对于同一个ASP.NET应用程序(同一个Web站点程序)来说,对象池里的数据都是共用的,使用示例:

WebApplicationObjectPool.Instance.Add("数据", "数据值");
var value1 = WebApplicationObjectPool.Instance.Get("数据").As<string>();

//通过扩展方法获取数据
var value2 = WebApplicationObjectPool.Instance.GetOrAdd<string>("数据1", () => "数据值1");

 

注意:如果需要在ASP.NET应用程序结束时自动回收数据,请在Global.asax里的Application_End事件里加上回收代码,如下示例:

protected void Application_End(object sender, EventArgs e)
{
    WebApplicationObjectPool.Instance.Dispose();
}

 

B、WebSessionObjectPool : 基于ASP.NET Session会话期的对象池

     对于同一个Session会话来说,对象池里的数据都是共用的,使用示例:

WebSessionObjectPool.Instance.Add("数据", "数据值");
var value1 = WebSessionObjectPool.Instance.Get("数据").As<string>();

//通过扩展方法获取数据
var value2 = WebSessionObjectPool.Instance.GetOrAdd<string>("数据1", () => "数据值1");

注意:如果需要在Session失效时自动回收数据,请在Global.asax里的Session_End事件里加上回收代码,如下示例:

protected void Session_End(object sender, EventArgs e)
{
    WebSessionObjectPool.Instance.Dispose();
}

 

 

C、WebRequestObjectPool : 基于ASP.NET Request请求上下文的对象池

     对于同一个Http Web Request会话来说,对象池里的数据都是共用的,使用示例:

.Instance.Add("数据", "数据值");
var value1 = .Instance.Get("数据").As<string>();

//通过扩展方法获取数据
var value2 = .Instance.GetOrAdd<string>("数据1", () => "数据值1");

注意:如果需要在Http Request完成时自动回收数据,请在web.config里注册WebRequestObjectPoolModule,如下示例:

        <httpModules>
            <add name="WebRequestObjectPoolModule" type="KT.Core.ObjectPool.WebRequestObjectPoolModule" />
        </httpModules>

 

 

D、ThreadCallObjectPool : 基于线程调用的对象池。此对象池可以在ASP.NET和Application环境下使用。

    对于同一个线程来说,对象池里的数据是共用的。使用示例:

public class Program
{
    static void Main(string[] args)
    {
        for (var i = 0; i < 100; i++)
        {
            Thread th = new Thread(()=>{
                var name = ThreadCallObjectPool.Instance.GetOrAdd<string>("K", ()=>Thread.CurrentThread.Name);
                Console.WriteLine("Thread: {0}, K={1}", Thread.CurrentThread.Name, name);
                Thread.Sleep(10);
                Console.WriteLine("Thread: {0}, K={1}", Thread.CurrentThread.Name, ThreadCallObjectPool.Instance.Get("K"));
            });
            th.Name = i.ToString();
            th.Start();
        }
        Console.Read();
    }
}

 

使用对象池上下文

KT里提供一个当前上下文的对象池调用“ObjectPoolContext”,此对象会自动根据您所处的上下文环境,调用对应的对象池实例。比如你当前的程序是运行在ASP.NET Web环境下,则会调用WebRequestObjectPool而如果是在Application环境下则会调用ThreadCallObjectPool对象池,如下示例代码:

/// <summary>
/// 商家模块
/// </summary>
public IMerchantsModule MerchantsModule
{
    get
    {
        return ObjectPoolContext.Current.GetOrAdd<IMerchantsModule>(
            typeof(MerchantsModule), () =>
            {
                return new MerchantsModule(this.DbHelper);
            });
    }
}
以上代码,不管是在ASP.NET环境还是在Application环境都可以正常运行。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110572.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Django接口_django中几个html互相跳转

    Django接口_django中几个html互相跳转前言在RESTful规范中,有关版本的问题,用restful规范做开放接口的时候,用户请求API,系统返回数据。但是难免在系统发展的过程中,不可避免的需要添加新的资源,或者修改现有资源。因此,改动升

    2022年7月31日
    2
  • git操作之pull拉取远程指定分支以及push推送到远程指定分支「建议收藏」

    git操作之pull拉取远程指定分支以及push推送到远程指定分支「建议收藏」一、pull操作1、将远程指定分支拉取到本地指定分支上:gitpull&lt;远程仓库名&gt;&lt;远程分支名&gt;:&lt;本地分支名&gt;2、将远程指定分支拉取到本地当前分支上:gitpull&lt;远程仓库名&gt;&lt;远程分支名&gt;3、将与本地当前分支同名的远程分支拉取到本地当前分支上gitpull&lt;远程仓库名&…

    2022年10月1日
    0
  • 讲解java源码_Java学习之Java源码讲解「建议收藏」

    讲解java源码_Java学习之Java源码讲解「建议收藏」关于Java中源码的学习,是不少同学头疼的知识点。本文整理了JAVA源码学习的八大要点,分别是基础知识、面向对象、异常处理、集合、综合类核心代码、JAVA8新特性、Input/Output和Java小实例。一、基础知识1.宏观上理解Java的本质2.JVM的原理3.Java变量4.Java数据类型5.Java运算符6.Java判断语句if-else7.Java循环语句switch-case\for…

    2022年7月7日
    25
  • 解析为什么hashmap是线程不安全的?「建议收藏」

    解析为什么hashmap是线程不安全的?「建议收藏」扩容一般我们声明HashMap时,使用的都是默认的构造方法:HashMap<K,V>,看了代码你会发现,它还有其它的构造方法:HashMap(intinitialCapacity,floatloadFactor),其中参数initialCapacity为初始容量,loadFactor为加载因子,扩容就是在put加入元素的个数超过initialCapacity*loa…

    2022年10月11日
    0
  • 四旋翼飞行器1——结构和控制原理

    四轴飞行器是一个在空间具有6个活动自由度(分别沿3个坐标轴作平移和旋转动作),但是只有4个控制自由度(四个电机的转速)的系统,因此被称为欠驱动系统(只有当控制自由度等于活动自由度的时候才是完整驱动系统)四旋翼飞行器的结构可大致分为两种结构形式:“十字形”结构该种结构四个旋翼对称分布在机体的前后、左右方向,四个旋翼处于同一高度平面,且四个旋翼的结构和半径都相同,四个电机对称的安装在飞行器的支…

    2022年4月8日
    77
  • sql2005数据库置疑的解决方法_sql数据库置疑修复工具

    sql2005数据库置疑的解决方法_sql数据库置疑修复工具数据库被置疑后的解决方法(一)A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQLServerEnterpriseManager 里面建立。B.停掉数据库服务器。C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据 库数据文件test_data.mdf。D.启动数据库服务器。此时会看

    2022年8月22日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号