Поставщик Memcached для NHibernate не работает

Я занимаюсь этим несколько дней. Я настроил конфигурацию своего веб-приложения / приложения для использования кеша второго уровня с сервером Memcached и поставщиком из NHContrib. У меня пока нет исключений, при тестировании я вижу, что он не использует кеш для моих запросов, которые я установил cacheable = true. Если я переключу поставщика на NHibernate.Cache.HashtableCacheProvider и протестирую его работу, как ожидалось.

вот соответствующие разделы конфигурации, которые я использую

<configuration>
  <configSections>
  <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate" />
  <section name="memcache" type="NHibernate.Caches.MemCache.MemCacheSectionHandler,NHibernate.Caches.MemCache" />
  </configSections>
  <memcache>
    <memcached host="192.168.215.60" port="11211" />
  </memcache>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">
        NHibernate.Connection.DriverConnectionProvider
      </property>
      <property name="dialect">
        MT.Core.Persistence.Dialect, MT.Core
      </property>
      <property name="connection.driver_class">
        NHibernate.Driver.SqlClientDriver
      </property>
      <property name="connection.connection_string">
        Server=192.168.1.1;Initial Catalog=Test;User ID=TestUser;Password=fakepassword;
      </property>
      <property name="show_sql">true</property>
      <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate.ByteCode.LinFu</property>
      <property name="cache.provider_class">NHibernate.Caches.MemCache.MemCacheProvider,NHibernate.Caches.MemCache</property>
      <!--<property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider</property>-->
      <property name="cache.use_second_level_cache">true</property>
      <property name="cache.use_query_cache">true</property>
    </session-factory>

  </hibernate-configuration>
</configuration>

person CountCet    schedule 07.01.2010    source источник


Ответы (3)


Проблема в конечном итоге возникла из-за проблемы с подключением. Я использовал log4net для записи любых ошибок в консоль и в журнал приложений. Именно тогда я наконец увидел ошибки, связанные с подключением к серверу memcached. Как только код был переведен на сервер в том же месте, ошибки исчезли. Я должен был научиться использовать log4net давным-давно.

person CountCet    schedule 20.01.2010

Для кэша памяти это свойство - «default_expiration», а не «expiration». Я не уверен в SysCache. Но я использовал это свойство для кэша памяти, и оно у меня работает.

Первоначально я также столкнулся с той же ошибкой, о которой упоминал CountCet. Атрибут "истечение срока" не распознается поставщиком MemCache. Позже я проверил код и обнаружил, что он использует свойство default_expiration и его значение по умолчанию составляет 300 секунд.

person golamrabbi    schedule 09.05.2011

Я думаю, что свойство истечения срока действия должно быть установлено для провайдера memcache на уровне фабрики сеанса, а не в конфигурации провайдера, как у других (SysCache)

<property name="expiration">300</property>
person MatthieuGD    schedule 07.01.2010
comment
в фабрике сеансов есть свойство для cache.default_expiration, но добавление этого не приводит к тому, что кеш работает. Я все еще вижу два запроса к базе данных в тесте, где я должен увидеть один. - person CountCet; 07.01.2010
comment
вы пробовали истечение срока, потому что я использую кэш памяти, и он работает для меня. - person MatthieuGD; 07.01.2010
comment
да внутри ‹session-factory› Я добавил это точное свойство, и оно выбрасывает и исключение. Я использую Nhibernate 2.1.2 - person CountCet; 07.01.2010
comment
более подробно: Атрибут 'name' недействителен - Значение 'expiration' недействительно в соответствии с его типом данных 'String' - Ограничение перечисления не удалось - person CountCet; 07.01.2010
comment
Log4net на самом деле показывает мне теперь, что он не может подключиться Не удалось получить SockIO obj для: 192.168.215.60:11211 - новый сокет не подключен Не уверен, почему я могу подключиться к серверу через Telnet, но nhibernate не открывается на этом порту - person CountCet; 12.01.2010