专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » c实现类:缓存类的实现(C#) »正文

c实现类:缓存类的实现(C#)

来源: 发布时间:星期四, 2009年2月12日 浏览:127次 评论:0


小弟最近在编写个O/RM组件(当然功能还是相当少).大家都应该清楚把实体对象更新到数据库必须经过系列转换;特别是SQL语句生成是比较费资源,中间处里东西实大是太多了.在设计过程中我就想如果个对象插入数据库后把相应Command保存在缓存Cache中;下次同个类型对象做这个操作时检测下缓存Cache如果有就直接拿来用这样效率应该会高些.抱着这种想法就开始设计了(不过心里还是上上下下,毕竟第次尝试).缓存Cache中对象处理比较复杂点,在多线程中存在共享问题,如果两个线程同时个Command这样定会产生处理!为了更好地控制Command对象共享,特别为Command定义了持久化接口.经过段时间设计和编写,算有点成果吧,顺把自己做东西共享下.以下是组件测试情况P4 2.4 1GSqlServer sp3运行代码大概如下:Entitys.Customers customer = Test.Entitys.Customers( );DateTime dt = DateTime.Now;using( HFSoft.Data.IDataSession session = mapcontainer.OpenSession( ) ){ session.Open( ); for( i =0; i<2000; i ) { customer.CustomerID = Guid.NewGuid( ).( ); customer.CompanyName = =cs_yinhao>\"henry\"; session.Save( customer ); }}tp1 = TimeSpan( DateTime.Now.Ticks - dt.Ticks );不开启缓存Cache(5个线程运行时间)00:00:05.703125000:00:06.828125000:00:05.015625000:00:06.687500000:00:06.4218750--------------------------------------------------------开启5个命令缓存Cache(5个线程运行时间)00:00:04.890625000:00:03.562500000:00:02.875000000:00:04.937500000:00:05.4843750---------------------------------------------------------以下是缓存Cache类源码=cs_comment>/// <summary>=cs_comment>/// 数据缓存Cache保存信息异步处理委托=cs_comment>/// </summary>delegate void EventSaveCache( object key,object value );=cs_comment>/// <summary>=cs_comment>/// 对象缓存Cache类=cs_comment>/// </summary>public Cache{ private MappingContainer mContainer; =cs_comment>/// <summary> =cs_comment>/// 获取或设置当前缓存Cache对象所在关系映象容器 =cs_comment>/// </summary> public MappingContainer Container { get { mContainer; } { mContainer = value; } } =cs_comment>/// <summary> =cs_comment>/// 构造缓存Cache对象 =cs_comment>/// </summary> public Cache( ) { =cs_comment>// // TODO: 在此处添加构造逻辑 // } =cs_comment>/// <summary> =cs_comment>/// 用于缓存Cache数据Hashtable =cs_comment>/// </summary> protected .Collections.Hashtable _Cache = .Collections.Hashtable( ); protected Object _LockObj = object( ); =cs_comment>/// <summary> =cs_comment>/// 获取指定键值对象 =cs_comment>/// </summary> =cs_comment>/// <param name=

=cs_yinhao>\"key\">键值</param>
=cs_comment>/// <s>object</s> public virtual object GetObject( object key ) { ( _Cache.ContainsKey( key ) ) _Cache[key]; null; } =cs_comment>/// <summary> =cs_comment>/// 把对象按指定键值保存到缓存Cache中 =cs_comment>/// </summary> =cs_comment>/// <param name==cs_yinhao>\"key\">键值</param> =cs_comment>/// <param name==cs_yinhao>\"value\">保存对象</param> public void SaveCaech( object key,object value ) { EventSaveCache save = EventSaveCache( SetCache ); IAsyncResult ar = save.BeginInvoke( key,value, .AsyncCallback( Results ),null ); } private void Results( IAsyncResult ar ) { EventSaveCache fd = ( EventSaveCache )( ( AsyncResult )ar ).AsyncDelegate; fd.EndInvoke( ar ); } =cs_comment>/// <summary> =cs_comment>/// 把对象按指定键值保存到缓存Cache中 =cs_comment>/// </summary> =cs_comment>/// <param name==cs_yinhao>\"key\">键值</param> =cs_comment>/// <param name==cs_yinhao>\"value\">保存对象</param> protected virtual void SetCache( object key ,object value ) { lock( _LockObj ) { ( !_Cache.ContainsKey( key ) ) _Cache.Add( key,value ); } } public Count { get { _Cache.Count; } } =cs_comment>/// <summary> =cs_comment>/// 在缓存Cache中删除指定键值对象 =cs_comment>/// </summary> =cs_comment>/// <param name==cs_yinhao>\"key\">键值</param> public virtual void DelObject( object key ) {

lock( _Cache.SyncRoot ) { _Cache.Remove( key ); } } =cs_comment>/// <summary> =cs_comment>/// 清除缓存Cache中所有对象 =cs_comment>/// </summary> public virtual void Clear( ) { lock( _Cache.SyncRoot ) { _Cache.Clear( ); } }}=cs_comment>/// <summary>=cs_comment>///针对条记录操作命令缓存Cache类=cs_comment>/// </summary>public CachePersistentCommand:Cache{ =cs_comment>/// <summary> =cs_comment>/// 把记录操作命令缓存Cache到内存中 =cs_comment>/// </summary> =cs_comment>/// <param name==cs_yinhao>\"key\">标识</param> =cs_comment>/// <param name==cs_yinhao>\"value\">值</param> protected override void SetCache( object key, object value ) { lock( _LockObj ) { count=0; ( Container.Config.CommandsCache.ContainsKey( key ) ) count=( ) Container.Config.CommandsCache[key]; .Collections.IList _list; =cs_comment>//如果缓存Cache中已经存在这种命令列表 ( _Cache.ContainsKey( key ) ) { _list = ( .Collections.IList )_Cache[key]; (count >0 )=cs_comment>//命令缓存Cache总数 { ( _list.Count < count )=cs_comment>//缓存Cache数据量少于缓存Cache总数 _list.Add( value ); } { ( _list.Count < Container.Config.CommandBuffer )=cs_comment>//缓存Cache数小于组件默认列表 _list.Add( value ); } } =cs_comment>//如果不存在列表 { ( count >0 || Container.Config.CommandBuffer >0 )=cs_comment>//如果组件允许对象缓存Cache { _list = .Collections.ArrayList( ); _list.Add( value ); _Cache.Add( key,_list ); } } } } =cs_comment>/// <summary> =cs_comment>/// 从缓存Cache中获取相关命令对象 =cs_comment>/// </summary>

=cs_comment>/// <param name==cs_yinhao>\"key\">标识</param> =cs_comment>/// <s>IPersistentCommand</s> public override object GetObject( object key ) { ( _Cache.Contains( key ) )=cs_comment>//如果命令存在缓冲中 { foreach( IPersistentCommand cmd in ( .Collections.IList )_Cache[key] ) { ( !cmd.State )=cs_comment>//命令是否可以过行锁定 ( cmd.Lock( ) )=cs_comment>//命令锁定 cmd; } } null; }}

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: