NHibernate, кэш второго уровня не работает с IQuery - PullRequest
2 голосов
/ 02 декабря 2011

Я работаю с кэшем второго уровня и использую 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();
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...