NHibernate用于WinForms应用程序的缓存

chi*_*oro 11 c# windows nhibernate caching

我有一个带有数据库后端(oracle)的C#WinForms应用程序,并使用NHibernate进行O/R映射.我想尽可能减少与数据库的通信,因为这里的网络很慢,所以我读到了二级缓存.我发现了这个非常好的介绍,它列出了以下可用的缓存实现.

我想知道我应该为我的应用程序使用哪个实现.

缓存应该很简单,它不应该显着减慢第一次出现的查询,并且它不应占用很多内存来加载实现程序集.(使用NHibernate和Castle,该应用程序已占用高达80 MB的RAM!)

  • Velocity:使用Microsoft Velocity,它是一种高度可扩展的内存应用程序缓存,适用于各种数据.
  • 普遍性:使用Bamboo.Prevalence作为缓存提供者.Bamboo.Prevalence是由Prevayler的Klaus Wuestefeld带来的对象流行概念的.NET实现.Bamboo.Prevalence为定位CLR的确定性系统提供透明对象持久性.它为智能客户端应用程序提供持久性缓存.
  • SysCache:使用System.Web.Caching.Cache作为缓存提供程序.这意味着您可以依赖ASP.NET缓存功能来了解它的工作原理.
  • SysCache2:与NHibernate.Caches.SysCache类似,使用ASP.NET缓存.此提供程序还支持基于SQL依赖性的过期,这意味着可以将某些缓存区域配置为在数据库中的相关数据发生更改时自动过期.
  • MemCache:使用memcached; memcached是一种高性能的分布式内存对象缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态Web应用程序.基本上是分布式哈希表.
  • SharedCache:高性能,分布式和复制的内存对象缓存系统.有关详细信息,请参阅此处和此处

到目前为止我的考虑是:

  • 速度似乎相当重量级和过度杀伤(文件完全占用467 KB的磁盘空间,到目前为止还没有测量到它所需的RAM,因为我没有设法让它运行,见下文)
  • 流行,至少在我的第一次尝试中,将我的查询从约0.5秒减慢到约5秒,并且缓存不起作用(见下文)
  • SysCache似乎适用于ASP.NET,而不适用于winforms.
  • MemCache和SharedCache似乎适用于分布式场景.

你建议我使用哪一个?还有一个内置的实现,当然它非常轻量级,但引用的文章告诉我," (...)永远不应该使用这个缓存提供程序来生成代码,而只是用于测试."

除了最适合我的情况的问题,我也遇到了应用它们的问题:

  • Velocity抱怨应用程序配置文件中未指定 " dcacheClient"标记.在配置文件中指定有效标记, "虽然我为程序集创建了一个app.config文件并粘贴了本文中的示例.

  • 如上所述,普遍性严重降低了我的第一个查询速度,下次执行完全相同的查询时,另一个选择被发送到数据库.也许我应该将这个话题"外化"到另一篇文章中.我会这样做,如果有人告诉我,查询速度减慢绝对不寻常,他需要更多细节来帮助我.

Die*_*hon 3

SysCache 使用“ASP.NET”缓存只是因为它是 .NET 2.x/3.x 中唯一包含的缓存(.NET 4 包含一个单独的 System.Runtime.Caching 程序集)

它可以毫无问题地用于桌面应用程序(我现在正在使用它),并且几乎不需要任何配置。

现在,你对记忆的考虑似乎与本世纪有些不同。过去几年里,没有哪台机器出厂的内存低于 1GB,大多数都在 2GB 到 8GB 之间,所以 80MB 基本上没什么。我写这篇文章的浏览器需要 220MB。

缓存的本质是使用资源(通常是内存,在非常特殊的情况下是磁盘)来减少较慢资源(网络)的使用