8。NHibernate缓存(NHibernate.Caches)
什么是 NHibernate.Caches?
NHibernate.Caches 是 NHibernate 的附加软件,它是Kevin Williams (aka k-dub)贡献的.缓存是一个保存实体的地点(在首次加载时);一旦进入缓存,能够取得它们,而无需(再次)查询的后台的存储(数据库)。这意味着它们能更快的加载(或重新加载)。
NHibernate session有一个内部的(一级)缓存,存放着它的实体。这些缓存没有共享,因此session被销毁时它的缓存也被销毁了。NHibernate提供了二级缓存系统;他在SessionFactory级别工作。因此它被同一个SessionFactory产生的session共享。
使用每个请求(request)一个session模式,很多个Session可以并发的访问同一个实体,而不用每次都访问数据库,因此性能获得了提升。
贡献者使得在NHibernate中使用不同的缓存提供者成为可能:
-
NHibernate.Caches.Prevalence使得使用底层的
Bamboo.Prevalence
实现作为缓存提供者成为可能。打开文件Bamboo.Prevalence.license.txt
可以看到它的许可信息,你也可以访问它的站点。 -
NHibernate.Caches.SysCache使得使用底层的
System.Web.Caching.Cache
实现作为缓存提供者成为可能。这意味着你可以依赖ASP.NET的缓存特性来理解它是怎么工作的。要得到更多的信息,可以阅读Caching Application Data(在NSDN上)。
这里是在NHibernate中启用二级缓存的步骤:
-
选择需要使用的缓存提供者并且拷贝它的程序集到你的程序集路径(
NHibernate.Caches.Prevalence.dll
或者NHibernate.Caches.SysCache.dll
). -
为了表明使用哪种缓存提供者,在NHibernate配置文件中(可以在
YourAssembly.exe.config
或者web.config
或者.cfg.xml
文件)添加下面的内容:<add key="hibernate.cache.provider_class" value="
XXX
" />(1) <add key="relativeExpiration" value="120
" />(2)(1) "
XXX
" 可以是 "NHibernate.Caches.
Prevalence
.PrevalenceCacheProvider, NHibernate.Caches.Prevalence
" 或者"NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache
"。(2) relativeExpiration
的值是你希望缓存每个实体的秒数(这里是两分钟) -
添加<cache usage="read-write|nonstrict-read-write|read-only"/>(在<class>后面)到你需要缓存的实体映射中.它也为集合(bag, list, map, set, ...)提供支持.
小心:缓存不会知道另一个进程存储的实体的变化(尽管配置了缓存数据的过期时间).当缓存被建立在SessionFactory级别,他们会和SessionFactory实例一起被销毁; 所以必须在你需要缓存的时候,保持SessionFactory存在.