手把手教你写ORM(七)

恕我卖个关子,如何得到Attribute的问题先放一放,肯定通过反射,有兴趣的也可以自己研究研究
今天先来说缓存的问题,对于数据缓存就我自己来说经历过很多次的反复,不过在.NET社区很多人都支持按需读取的原则,不过我觉的这是个误区,在单击程序的时候由于个人电脑的内存比较小和多用途性,很多程序都强调尽量少占用内存。不过在写服务程序的时候就是一个误区了,把常用数据缓存起来,在需要的时候快速调用才是提高性能的法宝,现在个人电脑的内存都按G算的年代,如何合理充分利用内存才是正途。
所以我们决定要在我们的demo orm中实现一个缓存,缓存什么呢?,insert语句的执行结果显然是不用了,我们只需要缓存每一次select的结果。并且由于.NET的Cache对象的局限性(只能在Web用),我们只有自己来实现一个。
其实设计上并不困难,我们之前在对配置的处理上其实已经用到了缓存的,我们只需要对其作一下修改,首先基础结构还是静态的HashTable,不过需要先确定以下用什么做Key,value好说,HashTable的Value就是个object,所以存个IList也行,int也行,一个对象也行,所以对于Select的结果来说还是很合适的。
主要就是确定Key的问题
我们这里确定一个前提就是,数据如果不变的情况下,那么如果Sql语句一样的话,select的结果应该都是一样的,那么我们直接用Sql语句来做Key。但是有的SQl是带变量的,比如select XX from TT where ID=@ID,
这个时候我们把Sql处理处理,用值把@ID Replace掉就行了:}

但是还有一个问题,如果有表被Insert了数据,或者update了数据,或者Delete了数据,那么之后Select出来的不就变了?确实,所以我们在做了这些操作后就要判断哪些缓存项是需要刷新的了。这个时候我们需要Key里面包含表的信息,虽然可以直接分析Sql获取,不过加大了成本,所以我们在生成Key的时候就把这条SQL涉及的表用[Tablename]的方式加在Key的最前面。

最后我们来看看代码:
None.gif namespace  Alexander.Xbase.Xcache
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public class ObjCache
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
private static SortedList<stringobject> data = new SortedList<stringobject>();
InBlock.gif
InBlock.gif        
public static void Insert(string Key, object dat)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            data.Add(Key, dat);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
public static SortedList<stringobject> GetObject
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return data;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif        
public static void Flash(string Classname)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            ArrayList removelist 
= new ArrayList();
InBlock.gif            
for (int i = 0; i < data.Count; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if (data.Keys[i].StartsWith(Classname))
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    removelist.Add(data.Keys[i]);
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
foreach (object o in removelist)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                data.Remove(o.ToString());
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

说了半天其实代码也不多,有的时候觉得很复杂的其实就这么简单。
不过这种Cache比较局限的就是可能Cache冗余的数据

to be continue......
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值