O NHibernate há muito tempo suporta a noção de caches de segundo nível, em que os resultados da consulta são salvos em um cache fora do processo para uma recuperação mais rápida. O NHContrib possui esses caches, que incluem ASP.NET HttpCache, Velocity (AppFabric) e Memcached. Esse último cache - Memcached - é implementado usando a biblioteca Enyim.Caching, da qual depende a biblioteca do cliente .NET Couchbase. Dada essa dependência e o fato de o Couchbase ser compatível com o Memcached, adicionar o Couchbase ao conjunto de caches de segundo nível disponíveis para o NHibernate pareceu natural.
Acabei de terminar a portabilidade do provedor NHContrib Memcached para o Couchbase. O novo cache do Couchbase está disponível no Couchbase Labs em https://github.com/couchbaselabs/nhibernate-caches-couchbase. Ele é plug and play e vem com um projeto ASP.NET MVC de amostra para demonstrar seu uso. Detalhei a configuração no arquivo README.md no repositório, mas vou apontar algumas das configurações do projeto de amostra para dar uma ideia de como usá-lo.
Na amostra, eu uso FluentNHibernate para configuração. Não descreverei o FluentNHibernate aqui, a não ser para dizer que ele permite que você configure o NHibernate no código, em vez do conjunto padrão de arquivos XML. No projeto de exemplo, tenho uma classe estática com um método estático para configurar o cliente.
{
público estático ISessionFactory CreateSessionFactory()
{
string connectionString = @"Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|Beers.mdf;Integrated Security=True;User Instance=True";
retorno Fluentemente.Configurar()
.Banco de dados(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString))
<forte>.Cache(c => c.UseQueryCache().Classe de provedor<CouchbaseCacheProvider>())</forte>
.Mapeamentos(m =>m.FluentMappings.AddFromAssemblyOf<Cerveja>())
.ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web"))
.BuildSessionFactory();
}
...
}
A linha relevante para o provedor de cache do Couchbase está na chamada fluente .Cache, na qual você está instruindo o NHibernate a armazenar em cache as consultas e a armazená-las usando o novo provedor de cache do Couchbase. Além disso, não há nada específico sobre o provedor Couchbase que precise ser configurado. No entanto, há algumas outras partes necessárias para usar qualquer cache de segundo nível. Você precisa ativar o cache na classe de modelo.
Então, para minha aula sobre cerveja:
{
[Necessário]
público virtual int Id { obter; definir; }
[Necessário]
público virtual string Nome { obter; definir; }
[Necessário]
público virtual string Cervejaria { obter; definir; }
[Necessário]
público virtual flutuante ABV { obter; definir; }
}
Tenho que definir a opção Cache no BeerMap.
{
público BeerMap()
{
Tabela("Cervejas");
<forte> Cache.Leitura e gravação();
</forte> Id(b => b.Id);
Mapa(b => b.Nome).Não.Nulável().Comprimento(30);
Mapa(b => b.Cervejaria).Não.Nulável().Comprimento(50);
Mapa(b => b.ABV).Não.Nulável();
}
}
Algo que deve ser lembrado em qualquer cache de segundo nível e projetos da Web. Por padrão, o cache será por solicitação, não por sessão. Você precisa configurar um aplicativo ASP.NET para gerenciar suas sessões conforme descrito aqui. Se você não configurar seu aplicativo dessa forma, verá que o cache está sendo recriado para cada solicitação, mesmo dentro da mesma sessão.
Portanto, se você estava esperando por uma solução de cache de segundo nível extremamente rápida e dimensionável para o NHibernate, ela está aqui.
Observe que esse provedor está incluído como parte do Couchbase Labs e não é um produto com suporte oficial. Você está livre para usar o código como quiser, pois ele está licenciado sob a Apache License 2.0. O projeto original encontrado no NHContrib está licenciado sob a LGPL.
Isso também funciona com o Membase?
Sim, é verdade.
Como definimos as regiões de cache para que possamos ajustar as expirações mais longas ou mais curtas para determinadas entidades ou consultas?