通行证: 用户 密码
域名空间  下载中心 社区论坛 信息公告 my小屋
联系我们
设为首页
加入收藏
热门:qq挂机,asp,php,jsp,xml
,sql,.net,编程 程序 网页图象
首页>网络编程>net专区>正文 中国黑客群攻击美政府网站 拿到部   微软计划开放office文件格式 消除   腾讯联合八部门严厉打击挂机网站   神六载人飞行圆满成功   美国会要求nasa彻底完成空间站建   google中国研究院有望落户清华   深度分析:论雅虎中国的夭折和阿   神六可能于10月13日上午11点发射   盖茨继续当全美首富   adobe ceo痛斥微软 称其管理层从   
热 点 排 行
dll文件下载
qq挂机的n种快速方法
长白山天池怪兽再现 一分钟
腾讯qq调整升级条件 不再诱
ape歌曲的播放、转换和刻录
新开放qq免费挂级网站
qq挂级程序,qq免费挂机源程
刘亦菲 变性人、堕胎,自称
photoshop通道抠图:给秀发
免费把qq炫铃设为本机qq的
用通通通作代理在局域网上
用6位qq注意啦,免费领取6位
超级女声总决赛 现场实况(
用nero制作win98多功能启动
亲身体验!让桌面不再粗糙
推 荐 新 闻
中国黑客群攻击美政府网站
bittorrent被好莱坞招安盗
网站建设中,关键词选择技
神六载人飞行圆满成功
国庆长假上网慎防“移动杀
连环起诉google 传统媒体欲
最强秘籍 ie7最新使用技巧
神六完成总装可接航天器 外
adobe ceo痛斥微软 称其管
微软急调张亚勤回中国 千里
微软宣布重大重组方案 将划
腾讯qq 2005 beta3火热发布
腾讯扩张路线图曝光 陈天桥
腾讯拍拍网正式吹响进军c2
第五届“西湖论剑”文字实
相 关 新 闻
首页>网络编程>net专区>正文

缓存类的实现(c#)


http://www.iyit.net  日期:2005-11-24 17:31:08  来源:易特网络技术  点击:
小弟最近在编写一个o/rm组件(当然功能还是相当少的)。
大家都应该清楚把实体对象更新到数据库必须经过一系列的转换;特别是sql语句的生成是比较费资源的,因为中间处里的东西实大是太多了。
在设计的过程中我就想如果一个对象插入数据库后把相应的command保存在缓存中;下一次同一个类型的对象做这个操作时检测一下缓存如果有就直接拿来用这样效率应该会高些。
抱着这种想法就开始设计了(不过心里还是上上下下的,毕竟第一次尝试)。
因为缓存中的对象处理比较复杂点,在多线程中存在共享的问题,如果两个线程同时调用同一个command这样一定会产生处理错误的!
为了更好地控制command对象的共享,特别为command定义了持久化的接口。
经过一段时间的设计和编写,算有点成果吧,顺把自己做的东西共享一下。

以下是组件测试的情况
p4 2.4 1g
sqlserver sp3
运行的代码大概如下:
entitys.customers customer = new test.entitys.customers();
datetime dt = datetime.now;
using(hfsoft.data.idatasession session = mapcontainer.opensession())
{
 session.open();
 for(int i =0;i<2000;i++)
 {
  customer.customerid = guid.newguid().tostring();
  customer.companyname = "henry";
  session.save(customer);
 }
}
tp1 = new timespan(datetime.now.ticks - dt.ticks);

不开启缓存(5个线程运行时间)
00:00:05.7031250
00:00:06.8281250
00:00:05.0156250
00:00:06.6875000
00:00:06.4218750
--------------------------------------------------------
开启5个命令缓存(5个线程运行时间)
00:00:04.8906250
00:00:03.5625000
00:00:02.8750000
00:00:04.9375000
00:00:05.4843750
---------------------------------------------------------
以下是缓存类的源码
/// <summary>
/// 数据缓存保存信息异步处理委托
/// </summary>
delegate  void eventsavecache(object key,object value);
/// <summary>
/// 对象缓存类
/// </summary>
public class cache
{
private mappingcontainer mcontainer;
/// <summary>
/// 获取或设置当前缓存对象所在的关系映象容器
/// </summary>
public mappingcontainer container
{
 get
 {
  return mcontainer;
 }
 set
 {
  mcontainer = value;
 }
}
/// <summary>
/// 构造缓存对象
/// </summary>
public cache()
{
 //
 // todo: 在此处添加构造函数逻辑
 //
}
/// <summary>
/// 用于缓存数据的hashtable
/// </summary>
protected  system.collections.hashtable _cache = new system.collections.hashtable();
protected object _lockobj = new object();
/// <summary>
/// 获取指定键值的对象
/// </summary>
/// <param name="key">键值</param>
/// <returns>object</returns>
public virtual object getobject(object key)
{
 if(_cache.containskey(key))
  return _cache[key];
 return null;
}
/// <summary>
/// 把对象按指定的键值保存到缓存中
/// </summary>
/// <param name="key">键值</param>
/// <param name="value">保存的对象</param>
public void savecaech(object key,object value)
{
 eventsavecache save = new eventsavecache(setcache);
 iasyncresult ar = save.begininvoke(key,value,new system.asynccallback(results),null);
}
private  void results(iasyncresult ar)
{
 eventsavecache fd = (eventsavecache)((asyncresult)ar).asyncdelegate;
 fd.endinvoke(ar);
}
/// <summary>
/// 把对象按指定的键值保存到缓存中
/// </summary>
/// <param name="key">键值</param>
/// <param name="value">保存的对象</param>
protected virtual void setcache(object key ,object value)
{
 lock(_lockobj)
 {
  if(!_cache.containskey(key))
   _cache.add(key,value);
 }
}
public int count
{
 get
 {
  return _cache.count;
 }
}
/// <summary>
/// 在缓存中删除指定键值的对象
/// </summary>
/// <param name="key">键值</param>
public virtual void delobject(object key)
{
 lock(_cache.syncroot)
 {
  _cache.remove(key);
 }
}
/// <summary>
/// 清除缓存中所有对象
/// </summary>
public virtual void clear()
{
 lock(_cache.syncroot)
 {
  _cache.clear();
 }
}
}
/// <summary>
///针对一条记录操作命令的缓存类
/// </summary>
public class cachepersistentcommand:cache
{
 
/// <summary>
/// 把记录操作命令缓存到内存中
/// </summary>
/// <param name="key">标识</param>
/// <param name="value">值</param>
protected override void setcache(object key, object value)
{
 lock(_lockobj)
 {
  int count=0;
  if(container.config.commandscache.containskey(key))
   count=(int) container.config.commandscache[key];
  system.collections.ilist _list;
  //如果缓存中已经存在这种命令的列表
  if(_cache.containskey(key))
  {
   _list = (system.collections.ilist)_cache[key];
    
   if( count >0)//命令的缓存总数
   {
    if(_list.count < count)//缓存数据量少于缓存总数
     _list.add(value);
   }
   else
   {
    if(_list.count < container.config.commandbuffer)//缓存数小于组件的默认列表
     _list.add(value);
   }
  }
  else//如果不存在列表
  {
   if(count >0 || container.config.commandbuffer >0)//如果组件允许对象缓存
   {
    _list = new system.collections.arraylist();
    _list.add(value);
    _cache.add(key,_list);
   }
  }
 }
}
/// <summary>
/// 从缓存中获取相关命令对象
/// </summary>
/// <param name="key">标识</param>
/// <returns>ipersistentcommand</returns>
public override object getobject(object key)
{
  
 if(_cache.contains(key))//如果命令存在缓冲中
 {
  foreach(ipersistentcommand cmd in (system.collections.ilist)_cache[key])
  {
   if(!cmd.state)//命令是否可以过行锁定
    if(cmd.lock())//命令锁定
     return cmd;
  }
 }
 return null;
}

}

上一篇:r.a.d.controls q2 2005中treeview 控件遮挡问题
下一篇:用asp.net获取客户端网卡的mac

[发送给好友] [打印本页] [关闭窗口] [返回顶部] 转载请注明来源:http://www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 投稿作者: 易特网络技术
信息来源: 易特网络技术 录入时间: 2005-11-24 17:31:08
浏览次数: 投稿信箱: shtghy@163.com
  友情链接
设置首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
copyrights ?2004-2005 iyit.net all rights reserved.
网站合作、广告联系qq:147007642、466949678
易特网络技术 点击这里给我发消息