zoukankan      html  css  js  c++  java
  • 使用NHibernate(9)-- 缓存

    1,对象状态。

    作为基础,还是先看一下对象的状态吧。主要涉及到三个名词,瞬时、持久、托管。

    clipboard[1]

    瞬时态:对象刚创建,Session还不知道这个对象的存在。可以通过调用ISession的Save等方法可以转变为持久态。

    持久态:对象刚通过ISession的Get或Load加载,如果对象被修改,则在操作提交时,会将修改同步到数据库中。

    托管态:程序中有这个对象,数据库中也有相应的记录,但该对象已经不被Session管理了。比如,通过ISession拿到一个对象后,管理了ISession,则刚才的对象出于托管态。处于托管态的对象可以被重新关联到某一个Session。

    2,一级缓存。

    NHibernate的缓存分为一级缓存和二级缓存。查询时也是按照“一级缓存 ->二级缓存 -> 数据库”的顺序进行查询的。以下截图来自《Working with NHibernate 3.0》

    clipboard[2]

    一级缓存是指保存在Session中的缓存,和其他Session是不共享的,也就是说每一个Session都有自己的缓存,并且只有自己可以访问,Session关闭则缓存失效。

    ISession提供了一些方法可以显示的管理缓存:

    ISession.Evict(object):从缓存中删除指定实例。

    ISession.Clear():清空缓存。

    ISession.Contains(object):检查缓存中是否包含指定实例。

    3,二级缓存。

    3.1,简介。

    二级缓存有和SessionFactory一样的生命周期,并且默认是关闭的。

    NHibernate默认提供的二级缓存是基于HashTable的NHibernate.Cache.HashtableCacheProvider。并且提供了ICacheProvicer接口供第三方缓存提供具体实现第三方实现的缓存还有如下方案:

    Velocity: 基于微软的AppFabric的实现。

    SharedCache:基于MergeSystem的分布式缓存组件。

    SysCache:基于.net中System.Web.Caching.Cache的缓存。

    SysCache2:和SysCache不同的是增加了Sql2005的缓存依赖的支持。

    Prevalence:基于Bamboo.Prevalence的缓存组件。

    MemCache:基于Memcached的分布式缓存的实现。

    3.2,使用。

    以使用HashtableCacheProvider为例。

    首先在Session-factory节点添加配置:

          <property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider</property>

          <property name="cache.use_second_level_cache">true</property>

          <property name="cache.use_query_cache">true</property>

    provider_class配置使用哪种缓存方案;use_second_level_cache:是否开启缓存;use_query_cache:是否开启查询缓存(下面会讨论)。

    然后对于要使用缓存的实体加上如下注解:

    clipboard[3]

    Usage是要使用的缓存策略。Include: 可选,默认值是all,即所有都缓存,如果设置为non-lazy,则延迟加载

    的属性不被缓存。region: 可选,默认值是类的名称,用来指定二级缓存的去域名。

    以后查询时,该实体会被缓存。

    3.3,查询缓存。

    如果需要对一个方法的查询结果进行缓存,则可以使用查询缓存。

    要使用查询,首先确保已经在配置中开启了查询缓存:<property name="cache.use_query_cache">true</property>。

    然后在代码中需要使用缓存的地方调用IQueryable.Cacheable(),方法(或是IQuery.SetCacheable),NHibernate会根据查询参数组成一个CacheKey,将查询结果作为value,存入缓存。

    clipboard[4]

    查询缓存中的集合会根据数据库的更改而改变。

    3.4,管理缓存。

    ISessionFactory提供了以下方法供显示管理二级缓存:

    Evict(persistentClass):从二级缓存中删除persistentClass类所有实例

    Evict(persistentClass, id):从二级缓存中删除指定的持久化实例

    EvictEntity(entityName):从二级缓存中删除命名实例

    EvictCollection(roleName):从二级缓存中删除集合

    EvictCollection(roleName, id):从二级缓存中删除指定的集合

    EvictQueries():从二级缓存中清空全部查询结果集

    EvictQueries(cacheRegion):从二级缓存中清空指定查询结果集

  • 相关阅读:
    5-把自己的系统刷到开发板
    4-构建网络文件系统
    ipc
    advio
    pthread
    signal
    process_control
    python3.6+selenium_Testsuits测试套件
    python3.6+selenium_多个测试用例
    jQuery的九类选择器
  • 原文地址:https://www.cnblogs.com/FuzhePan/p/3652153.html
Copyright © 2011-2022 走看看