NHibernate学习之旅

http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html

 

学习摘要:

 

NHibernate缓存机制

----------------------------

 

NHibernate一级缓存即ISession缓存,ISession缓存属于事务级缓存,是NHibernate内置的。ISession缓存中的数据只在本ISession周期内使用。

比较ISession.Get()和ISession.Load():使用ISession.Get()方法立即把对象实例保存到缓存中,使用ISession.Load()方法当你需要使用的时候再访问数据库把这个实例保存在缓存中。

显式管理一级缓存:
        ISession.Evict(object):从缓存中删除指定实例。
        ISession.Clear():清空缓存。
        ISession.Contains(object):检查缓存中是否包含指定实例。

 

 

NHibernate二级缓存由ISessionFactory创建,可以被所有的ISession共享。
NHibernate本身提供了一个基于Hashtable的HashtableCache缓存,但是功能非常有限而且性能比较差,不适合在大型应用程序使用,我们可以使用第三方缓存提供程序作为NHibernate二级缓存实现。
但是,使用缓存的缺点就是如果缓存策略设置不当,NHibernate不知道其它应用程序对数据库的修改及时更新缓存。因此,建议只对系统经常使用、数据量不大且不会被其它应用程序修改的只读数据(或很少被修改的数据)使用缓存。
NHibernate提供了NHibernate.Cache.ICacheProvider接口用来支持第三方缓存提供程序实现。

NHibernate内置四种并发访问策略:

                 read-only:只读缓存。适用于只读数据。可用于群集中。
                 read-write:读写缓存。
                 nonstrict-read-write:非严格读写缓存。不保证缓存与数据库的一致性。
                 transactional:事务缓存。提供可重复读的事务隔离级别。


NHibernate二级缓存由ISessionFactory创建并由ISessionFactory自行维护, 同时也提供了可编程方式的缓存管理方法。

ISessionFactory提供了一系列的EvictXXX()方法可以方便的从二级缓存中删除一个实例、删除一个集合、一个命名缓存等操作

Evict(persistentClass):从二级缓存中删除persistentClass类所有实例
Evict(persistentClass, id):从二级缓存中删除指定的持久化实例
EvictEntity(entityName):从二级缓存中删除命名实例
EvictCollection(roleName):从二级缓存中删除集合
EvictCollection(roleName, id):从二级缓存中删除指定的集合
EvictQueries():从二级缓存中刷新全部查询结果集
EvictQueries(cacheRegion):从二级缓存中刷新指定查询结果集

 

ISession内置缓存可以共享ISessionFactory缓存,通过指定ISession的CacheMode可以控制ISession和ISessionFactory的交互方式。
ISession可以通过以下五种方式和ISessionFactory交互:

                                                    Ignore:更新数据时将二级缓存失效,其它时间不和二级缓存交互
                                                    Put:向二级缓存写数据,但不从二级缓存读数据
                                                    Get:从二级缓存读数据,仅在数据更新时向二级缓存写数据
                                                    Normal:默认方式。从二级缓存读/写数据
                                                    Refresh:向二级缓存写数据,想不从二级缓存读数据,通过在配置文件设置

                                                                   cache.use_minimal_puts从数据库中读取数据时,强制二级缓存刷新

强制刷新缓存区域,以避免数据不一致问题: ISession.SetCacheMode(CacheMode.Refresh)

你可能感兴趣的:(.NET)