2010-06-18 11 views
11

Tengo una aplicación C# WinForms con un backend de base de datos (oracle) y uso NHibernate para mapeo O/R. Me gustaría reducir la comunicación a la base de datos tanto como sea posible ya que la red aquí es bastante lenta, así que leí sobre el segundo nivel de almacenamiento en caché. Encontré this quite good introduction, que enumera las siguientes implementaciones de caché disponibles.NHibernate qué caché usar para la aplicación WinForms

Me pregunto qué implementación debo usar para mi aplicación.

El almacenamiento en caché debe ser simple, no debe ralentizar significativamente la primera vez que se realiza una consulta y no debe ocupar mucha memoria cargar los ensamblados de implementación. (Con NHibernate y el Castillo, la aplicación ya se toma hasta 80 MB de RAM!)

  • Velocidad: Microsoft utiliza la velocidad que es una aplicación altamente escalable caché en memoria para todo tipo de datos.
  • Prevalencia: utiliza Bamboo.Prevalence como el proveedor de caché. Bamboo.Prevalence es una implementación de .NET del concepto de prevalencia de objetos que dio vida Klaus Wuestefeld en Prevayler. Bamboo.Prevalence proporciona persistencia transparente de objetos a sistemas deterministas que se dirigen al CLR. Ofrece almacenamiento en caché persistente para aplicaciones de clientes inteligentes.
  • SysCache: utiliza System.Web.Caching.Cache como el proveedor de caché. Esto significa que puede confiar en la función de almacenamiento en caché de ASP.NET para comprender cómo funciona.
  • SysCache2: similar a NHibernate.Caches.SysCache, utiliza caché de ASP.NET. Este proveedor también admite la caducidad basada en la dependencia de SQL, lo que significa que es posible configurar ciertas regiones de caché para que expiren automáticamente cuando cambian los datos relevantes en la base de datos.
  • MemCache: utiliza memcached; memcached es un sistema de caché de objetos de memoria distribuida de alto rendimiento, de naturaleza genérica, pero destinado a agilizar aplicaciones web dinámicas aliviando la carga de la base de datos. Básicamente una tabla hash distribuida.
  • SharedCache: sistema de memoria caché de objetos de memoria distribuida y replicada de alto rendimiento. Ver aquí y aquí para más información

Mis consideraciones hasta ahora eran:

  • velocidad parece bastante peso pesado y un exceso (los archivos totalmente toman 467 KB de espacio en disco, no han medido la RAM lleva tan lejos porque no logré hacerlo funcionar, vea abajo)
  • La prevalencia, al menos en mi primer intento, ralentizó mi consulta de ~ 0.5 segundos a ~ 5 segundos, y el almacenamiento en caché no funcionó (ver abajo)
  • SysCache parece ser para ASP.NET, no para winforms.
  • MemCache y SharedCache parecen ser para escenarios distribuidos.

¿Cuál me recomendarían usar? También habría una implementación incorporada, que por supuesto es muy liviana, pero el artículo al que se hace referencia me dice que "(...) nunca debería usar este proveedor de caché para el código de producción, solo para probar."

Además de la cuestión que se ajusta mejor en mi situación que también se enfrentó a problemas con su aplicación:

  • velocidad se quejó de que" la etiqueta dcacheClient" no especificado en el archivo de configuración de la aplicación Especificar etiqueta válida. en el archivo de configuración, "aunque creé un archivo app.config para el ensamblado y pegué el ejemplo en this article.

  • La prevalencia, como se mencionó anteriormente, ralentizó en gran medida mi primera consulta, y la próxima vez que se ejecutó exactamente la misma consulta, se envió otra selección a la base de datos. Tal vez debería "externalizar" este tema en otra publicación. Haré eso si alguien me dice que es absolutamente inusual que una consulta se ralentice tanto y que necesite más detalles para ayudarme.

+0

El enlace a la buena introducción ya no funciona , Creo que los rinocerontes Hibernating han cambiado las cosas. Después de buscar un poco, encontré [esta publicación] (http://nhibernate.hibernatingrhinos.com/28/first-and-second-level-caching-in-nhibernate), que creo que es la que se menciona aquí. –

+0

@John: Gracias por el aviso, hemos actualizado el enlace en consecuencia. Es exactamente ese artículo. – chiccodoro

Respuesta

3

SysCache utiliza la caché "ASP.NET" sólo porque es el único que incluye con .NET 2.x/3.x (.NET 4 incluye un conjunto de System.Runtime.Caching separada)

Se puede usar en aplicaciones de escritorio sin ningún problema (lo estoy usando ahora mismo) y casi no requiere configuración.

Ahora, las consideraciones de su memoria parecen estar un poco fuera de este siglo. Ninguna máquina se ha enviado con menos de 1 GB en los últimos años, y la mayoría tiene entre 2 GB y 8 GB, por lo que 80 MB básicamente no es nada. El navegador en el que escribo esto toma 220MB.

El muy esencia de almacenamiento en caché es acerca del uso de un recurso (por lo general de memoria, disco en casos muy particulares) para reducir el uso de una más lenta (red)

+0

Hola Diego. De alguna manera tienes razón en lo que concierne a la memoria. Por supuesto, no espero que los datos almacenados en caché no lleven ningún tipo de memoria, pero no me gusta si solo cargar los ensamblajes ya requiere tanto. De hecho, las PC que estoy enfrentando son en parte bastante antiguas, y también la aplicación debe cargarse desde la red cada vez que implementamos una nueva versión (ClickOnce), por lo que el espacio en el disco también es una preocupación. – chiccodoro

Cuestiones relacionadas