Проблемы NHIbernate SysCache2 и SQLDependency

Я установил enable_broker на своем SQL Server 2008 для использования SQLDepndency.

Я настроил свое приложение .Net для использования Syscache2 с областью кеша следующим образом:

  <syscache2>
      <cacheRegion name="BlogEntriesCacheRegion" priority="High">
        <dependencies>
          <commands>
            <add name="BlogEntries" 
                 command="Select EntryId from dbo.Blog_Entries where ENABLED=1" 
            />
          </commands>
        </dependencies>
      </cacheRegion>
  </syscache2>

Мой файл Hbm выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">

  <class name="BlogEntry" table="Blog_Entries">

    <cache usage="nonstrict-read-write" region="BlogEntriesCacheRegion"/>
    ....
  </class>
</hibernate-mapping>

У меня также включено кэширование запросов для запросов к BlogEntry.

Когда я впервые запрашиваю, результаты кэшируются в кеше 2-го уровня, как и ожидалось.

Если я сейчас пойду и изменю строку в blog_entries, все будет работать как положено, срок действия кеша истек, появится следующее сообщение:

2010-03-03 12:56:50,583 [7] DEBUG NHibernate.Caches.SysCache2.SysCacheRegion - Cache items for region 'BlogEntriesCacheRegion' have been removed from the cache for the following reason : DependencyChanged

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

DEBUG NHibernate.Caches.SysCache2.SysCacheRegion - Cache items for region 'BlogEntriesCacheRegion' have been removed from the cache for the following reason : DependencyChanged

Мой кеш постоянно аннулируется каждый последующий раз без каких-либо изменений в базовых данных. Только перезапуск приложения позволяет кешу снова работать, но только при первом кэшировании данных (опять же, первое загрязнение кеша приводит к тому, что он больше никогда не работает)

Кто-нибудь видел эту проблему или есть какие-либо идеи, что это может быть? Я думал, что syscache2 должен обрабатывать событие SQLDependency onChange, что он, вероятно, и делает, поэтому я не понимаю, почему SQL Server продолжает отправлять SQLDependency depedencyChanged.

Спасибо


person user285747    schedule 03.03.2010    source источник
comment
Вы можете проверить, что происходит с SQL Profiler? SQLDependency нужны какие-то странные разрешения, может быть, это как-то связано с этим?   -  person Mauricio Scheffer    schedule 07.03.2010


Ответы (1)


Мы получаем ту же проблему на одном экземпляре базы данных, но не на другом. Определенно кажется, что это какая-то проблема с правами доступа на стороне базы данных, потому что в обоих случаях используется одна и та же конфигурация NHibernate.

В рабочем случае кеш ведет себя так, как ожидалось, в другом (который представляет собой механизм базы данных с гораздо более строгими разрешениями) мы получаем точно такое же поведение, о котором вы упомянули.

person Roy Jacobs    schedule 29.03.2010