1.学习目标
通过进一步学习nhibernate,了解二级缓存在nhiernate中的工作机制以及使用方法
2.开发环境和必要准备
开发环境为:windows 2003,visual studio .net 2005,sql server 2005 developer edition
必要准备:学习前五篇nhibernate学习系列nhibernate学习之起步篇-1 ,nhibernate学习起步之many-to-one篇 ,nhibernate学习之many-to-many篇 ,nhibernate学习之三级联(ternary associations)篇 ,nhibernate学习之性能改善1
3.学前分析
在买电脑的时候,我们经常会看cpu的配置,其中衡量cpu性能的一项指标为二级缓存-level 2 cache,二级缓存越大,cpu性能越高。这是为什么,大家知道cpu的处理速度非常快,比在内存(memory)中的操作快上很多倍,这样在系统运行的时候,势必会造成一定的瓶颈效应,在内存和cpu之间加上一块处理速度在内存和处理器之间的介质-高速缓存,可以起到平衡的作用,每次cpu都试图先从高速缓存中读取数据,如果没有的话,再去内存中读取,一般cpu对高速缓存的命中率都在90%以上,所以大大提高了性能。在内存和磁盘之间加上一个高速缓存也可提高系统的新性能,减少对磁盘的io次数
4.如何在nhibernate中启动二级缓存
在nhiernate中的isession对象中,已经存在了一级缓存,但是在isession级别的,我们从上一节可以看出,isession对象应该是尽早释放的,那依赖它的一级缓存会在它销毁的地时候销毁,所以一级缓存命中率比较低。而isessionfactory对象推荐为不频繁创建,非常适用于cache的使用,那这里的二级缓存正是isessionfactory级别的。
要想在nhibernate中启用二级缓存,请在hibernate.cfg.xml中添加如下代码:
nhibernate.caches.syscache.syscacheprovider, nhibernate.caches.syscache还可以替换为nhibernate.caches.prevalence.prevalencecacheprovider, nhibernate.caches.prevalence,代表缓存的实现类,在bin目录中有这样两个dllnhibernate.caches.syscache.dll,nhibernate.caches.prevalence.dll用哪个就把哪个拷贝到应用程序的bin目录下
expiration代表缓存过期时间,单位s
设置完后,还需要在对象的映射文件中配置二级缓存的策略,比如我在user.hbm.xml中如下配置
nhibernatehelper.cs
页面代码:
第一次运行,用sql事件探查器,结果为
从截图中的sql语句看,第一次从数据库中加在user数据
第二次
从图中可以看出,第二次加载user对象,并没有从数据中获取数据,而是将没有设置cache的role信息从user里面获取。
当然在利用缓存的时候,缓存不会知道另外一个进程存储的实体发生变化,应该自己建立一些策略来及时地更新缓存快照。而且当isessionfactory销毁的时候,二级缓存也会随之销毁,这也是应用的时候,应该注意的。
闽公网安备 35060202000074号