Объекты, возвращаемые с помощью ISQLQuery, не хранятся в кэше второго уровня NHibernate? - PullRequest
1 голос
/ 03 февраля 2011

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

Если я получаю эти объекты с помощью ICriteria, то эти объекты помещаются в кэш второго уровня, однако, если я получаю их через ISQLQuery (функция-табличное значение), тогда эти объекты не кэшируются. Вызов .SetCacheable (true) и т. Д. Не имеет никакого эффекта.

Итак, кэширование второго уровня с ISQLQuery не поддерживается или мне не хватает некоторых настроек?

Edit:

Пример - первый запрос во всем приложении после перезапуска IIS:

var query = _session.CreateSQLQuery("SELECT {foo.*} fro dbo.foo_GetList()");
query.AddEntity("foo", typeof(Foo));
query.SetCacheable(true);
query.List<Foo>();

Когда запускается приведенный выше код, я не вижу ничего добавленного в кеш (например, нет NHibernate.Caches.SysCache.SysCache - добавление новых данных в журнал NHibernate). Последующие вызовы, такие как _session.Get (id), делают новый выбор. Если я заменю следующее на

var criteria = _session.CreateCriteria<Foo>();
criteria.List<Foo>();

тогда сущности кэшируются.

Кроме того, мне кажется, что при использовании возвращаемых объектов ISQLQuery не следует выбирать зависимые объекты из кэша, а выбирать их заново.

1 Ответ

3 голосов
/ 03 февраля 2011

У меня отлично работает.Вот подтверждение концепции:

Класс:

public class Foo
{
    public virtual int Data { get; set; }
}

Отображение:

<class name="Foo">
  <cache usage="read-write" />
  <id type="Guid">
    <generator class="guid.comb" />
  </id>
  <property name="Data" />
</class>

Код теста:

        using (var session = sessionFactory.OpenSession())
        using (var tx = session.BeginTransaction())
        {
            session.Save(new Foo { Data = 1 });
            tx.Commit();
        }
        using (var session = sessionFactory.OpenSession())
        using (var tx = session.BeginTransaction())
        {
            session.CreateSQLQuery("select {foo.*} from {foo}")
                   .AddEntity("foo", typeof(Foo))
                   .SetCacheable(true)
                   .List();
            tx.Commit();
        }
        using (var session = sessionFactory.OpenSession())
        using (var tx = session.BeginTransaction())
        {
            session.CreateSQLQuery("select {foo.*} from {foo}")
                   .AddEntity("foo", typeof(Foo))
                   .SetCacheable(true)
                   .List();
            tx.Commit();
        }

Второй сеансне приводит к попаданию в БД.

Убедитесь, что вы настроили поставщика кеша и включили как кеш запросов, так и кеширование для вашей сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...