Я работаю с кэшем второго уровня и использую Hashtable по умолчанию, так как я только тестирую эту функцию.Я настроил файл hibernate.cfg.xml следующим образом:
<property
name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider</
property>
<!-- You have to explicitly enable the second level cache -->
<property name="cache.use_second_level_cache">true</property>
<!-- cache will expire in 2 minutes -->
<property name="cache.default_expiration">120</property>
<!-- I want also to cache queries -->
<property name="cache.use_query_cache">true</property>
И я настроил свою сущность для кэширования следующим образом:
<class
name="CachableProduct"
table="[CachableProduct]"
dynamic-insert="true"
dynamic-update="true">
<cache usage="read-write"/>
<id name="ProductId">
<generator class="guid.comb" />
</id>
<property name="Name">
</property>
<property name="Price">
</property>
</class>
Когда я пытаюсьЗапустите следующий модульный тест, он всегда выводит два оператора SELECT, поэтому он явно не кэширует сущность.Но если я напишу модульный тест, вызывающий Load или Get из двух разных сессий, кэш 2-го уровня сработает, поэтому я считаю, что у меня проблема только с кешем запросов.
using (var session = factory.OpenSession())
{
using (var tx =
session.BeginTransaction(IsolationLevel.ReadCommitted))
{
Console.WriteLine("*** FIRST SESSION ***");
var result = session
.CreateCriteria(typeof(CachableProduct))
.SetCacheable(true)
.Add(Restrictions.Eq("Name", "PC"))
.List<CachableProduct>();
tx.Commit();
}
}
using (var session = factory.OpenSession())
{
using (var tx =
session.BeginTransaction(IsolationLevel.ReadCommitted))
{
Console.WriteLine("*** SECOND SESSION ***");
var result = session
.CreateCriteria(typeof(CachableProduct))
.SetCacheable(true)
.Add(Restrictions.Eq("Name", "PC"))
.List<CachableProduct>();
tx.Commit();
}
}