我有一个带有数据库后端 (oracle) 的 C# WinForms 应用程序,并使用 NHibernate 进行 O/R 映射。我想尽可能减少与数据库的通信,因为这里的网络非常慢,所以我阅读了有关二级缓存的内容。我发现这个很好的介绍 http://nhibernate.hibernatingrhinos.com/28/first-and-second-level-caching-in-nhibernate,其中列出了以下可用的缓存实现。
我在想我的应用程序应该使用哪种实现.
缓存应该很简单,它不应该显着减慢查询的第一次出现,并且不应该占用太多内存来加载实现程序集。 (使用 NHibernate 和 Castle,应用程序已占用高达 80 MB 的 RAM!)
- Velocity:使用 Microsoft Velocity,它是一种高度可扩展的内存应用程序缓存,适用于各种数据。
- Prevalence:使用 Bamboo.Prevalence 作为缓存提供程序。 Bamboo.Prevalence 是 Klaus Wuestefeld 在 Prevayler 中实现的对象普遍性概念的 .NET 实现。 Bamboo.Prevalence 为针对 CLR 的确定性系统提供透明的对象持久性。它为智能客户端应用程序提供持久缓存。
- SysCache:使用System.Web.Caching.Cache作为缓存提供程序。这意味着您可以依靠 ASP.NET 缓存功能来了解它的工作原理。
- SysCache2:与NHibernate.Caches.SysCache类似,使用ASP.NET缓存。该提供程序还支持基于 SQL 依赖项的过期,这意味着可以将某些缓存区域配置为在数据库中的相关数据发生更改时自动过期。
- MemCache:使用memcached; memcached 是一种高性能、分布式内存对象缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态 Web 应用程序。基本上是一个分布式哈希表。
- SharedCache:高性能、分布式、可复制的内存对象缓存系统。请参阅此处和此处了解更多信息
到目前为止我的考虑是:
- Velocity 似乎相当重量级和杀伤力过大(这些文件总共占用了 467 KB 的磁盘空间,到目前为止还没有测量它所占用的 RAM,因为我没有设法让它运行,见下文)
- 至少在我的第一次尝试中,普遍性将我的查询速度从约 0.5 秒减至约 5 秒,并且缓存不起作用(见下文)
- SysCache 似乎是针对 ASP.NET 的,而不是针对 winforms 的。
- MemCache和SharedCache似乎都是针对分布式场景的。
您建议我使用哪一个?还会有一个内置的实现,这当然是非常轻量级的,但是引用的文章告诉我,我“(...) 永远不应将此缓存提供程序用于生产代码,而仅用于测试."
除了最适合我的情况的问题之外,我还面临应用它们的问题:
速度抱怨说“dcacheClient”标签未在应用程序配置文件中指定。在配置文件中指定有效标签,“虽然我为程序集创建了一个 app.config 文件并粘贴了示例本文 http://blogs.circlesource.com/2009/01/20/velocity-usages-and-its-advantages/.
如上所述,普遍性严重减慢了我的第一个查询,并且下次执行完全相同的查询时,另一个选择被发送到数据库。也许我应该将这个主题“外化”到另一篇文章中。如果有人告诉我查询速度如此之慢是绝对不寻常的,并且他需要更多详细信息来帮助我,我就会这样做。
SysCache 使用“ASP.NET”缓存只是因为它是 .NET 2.x/3.x 中唯一包含的缓存(.NET 4 包含一个单独的 System.Runtime.Caching 程序集)
它可以毫无问题地用于桌面应用程序(我现在正在使用它),并且几乎不需要任何配置。
现在,你对记忆的考虑似乎与本世纪有些不同。过去几年里,没有哪台机器出厂的内存低于 1GB,大多数都在 2GB 到 8GB 之间,所以 80MB 基本上没什么。我写这篇文章的浏览器需要 220MB。
很essence缓存是指使用一种资源(通常是内存,在非常特殊的情况下是磁盘)来减少较慢资源(网络)的使用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)