NHibernate ha soportado durante mucho tiempo la noción de cachés de segundo nivel, donde los resultados de las consultas se guardan en una caché fuera de proceso para una recuperación más rápida. La dirección NHContrib posee estas cachés, que incluyen ASP.NET HttpCache, Velocity (AppFabric) y Memcached. Esta última caché - Memcached - está implementada usando la librería Enyim.Caching de la que depende la librería .NET Couchbase Client Library. Dada esa dependencia y el hecho de que Couchbase es, por supuesto, compatible con Memcached, añadir Couchbase al conjunto de cachés de segundo nivel disponibles para NHibernate parecía natural.
Acabo de terminar de portar el proveedor NHContrib Memcached a Couchbase. La nueva caché de Couchbase está disponible en Couchbase Labs en http://github.com/couchbaselabs/nhibernate-caches-couchbase. Es plug and play y viene con un proyecto ASP.NET MVC de ejemplo para demostrar su uso. He detallado la configuración en el archivo README.md en el repositorio, pero voy a señalar algunos de los ejemplos de configuración del proyecto para dar una idea de cómo usarlo.
En la muestra, utilizo FluentNHibernate para la configuración. No voy a describir FluentNHibernate aquí más que para decir que le permite configurar NHibernate en código, en lugar del conjunto estándar de archivos XML. En el proyecto de ejemplo, tengo una clase estática con un método estático para configurar el cliente.
{
público estático ISessionFactory CrearSesiónFactoría()
{
cadena connectionString = @"Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|Beers.mdf;Integrated Security=True;User Instance=True";
devolver Con fluidez.Configure()
.Base de datos(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString))
<fuerte>.Caché(c => c.UseQueryCache().ClaseProveedor<CouchbaseCacheProvider>())fuerte>
.Asignaciones(m =>m.FluentMappings.AddFromAssemblyOf<Cerveza>())
.ExposeConfiguration(c => c.EstablecerPropiedad("current_session_context_class", "web"))
.BuildSessionFactory();
}
…
}
La línea relevante para el proveedor de caché de Couchbase se encuentra en la llamada fluida a .Cache, donde se indica a NHibernate que almacene las consultas en caché y que lo haga utilizando el nuevo proveedor de caché de Couchbase. Aparte de eso, no hay nada específico sobre el proveedor de Couchbase que necesite ser configurado. Sin embargo, hay algunas otras piezas necesarias para utilizar cualquier caché de segundo nivel. Necesitas habilitar la caché en la clase modelo.
Así que para mi clase de cerveza:
{
[Requerido]
público virtual int Id { consiga; configure; }
[Requerido]
público virtual cadena Nombre { consiga; configure; }
[Requerido]
público virtual cadena Cervecería { consiga; configure; }
[Requerido]
público virtual float ABV { consiga; configure; }
}
Tengo que configurar la opción Caché en el BeerMap.
{
público BeerMap()
{
Cuadro("Cervezas");
<fuerte> Caché.LecturaEscritura();
fuerte> Id(b => b.Id);
Mapa(b => b.Nombre).No.Anulable().Longitud(30);
Mapa(b => b.Cervecería).No.Anulable().Longitud(50);
Mapa(b => b.ABV).No.Anulable();
}
}
Algo a tener en cuenta con cualquier caché de 2º nivel y proyectos web. Por defecto la caché será por petición - no por sesión. Es necesario configurar una aplicación ASP.NET para gestionar sus sesiones como se describe aquí. Si no configuras tu aplicación de esta manera, verás que la caché se está recreando para cada solicitud, incluso dentro de la misma sesión.
Así que si has estado esperando una solución de caché de segundo nivel para NHibernate que sea rápida y escalable, ya está aquí.
Ten en cuenta que este proveedor se incluye como parte de Couchbase Labs y no es un producto con soporte oficial. Eres libre de usar el código como quieras ya que está licenciado bajo Apache License 2.0. El proyecto original que se encuentra en NHContrib está licenciado bajo la LGPL.
¿Funciona esto también con Membase?
Pues sí.
¿Cómo definimos las regiones de caché de modo que podamos ajustar vencimientos más largos o más cortos para determinadas entidades o consultas?