如何在Hibernate中开启二级缓存

默认情况下,Hibernate的ISession为一级缓存,一级缓存是在ISession级别的,ISession对象应该是尽早释放的,那依赖它的一级缓存会在它销毁的时候销毁,所以一级缓存命中率比较低。而ISessionFactory对象推荐为不频繁创建,非常适用于Cache的使用,那二级缓存正是ISessionFactory级别的。
  要想在nhibernate中启用二级缓存,请在hibernate.cfg.xml中添加如下代码:
<property name="hibernate.cache.provider_class">
NHibernate.Caches.SysCache.SysCacheProvider,NHibernate.Caches.SysCache</property>
<property name="expiration">120</property>
注意:
NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache还可以替换为NHibernate.Caches.Prevalence.PrevalenceCacheProvider, NHibernate.Caches.Prevalence,代表缓存的实现类,在NHibernate的安装目录的bin目录中有这样两个dll:
NHibernate.Caches.SysCache.dll,NHibernate.Caches.Prevalence.dll用哪个就把哪个拷贝到应用程序的bin目录下。expiration代表缓存过期时间,单位为秒。

设置完后,还需要在对象的映射文件中配置二级缓存的策略,比如我在User.hbm.xml中如下配置,注意红色字体部分:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="NhibernateSample1.User,NhibernateSample1" table="Users" lazy="false">
    <cache usage="read-write"/>    <id name="Id" column="Id" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="Name" column="Name" type="string" length="64" not-null="true" unique="true"></property>
    <property name="Pwd"  column="Pwd"  type="string" length="64" not-null="true"></property>
    <many-to-one name="Role"  class="NhibernateSample1.Role,NhibernateSample1" column="RoleID"></many-to-one>
   </class>
</hibernate-mapping>

当然在利用缓存的时候,缓存不会知道另外一个进程存储的实体发生变化,应该自己建立一些策略来及时地更新缓存快照。而且当ISessionFactory销毁的时候,二级缓存也会随之销毁。

你可能感兴趣的:(Hibernate,xml,cache)