Как настроить SysCache на Fluent NHibernate? - PullRequest
3 голосов
/ 18 октября 2010

Используя это, я могу сказать Fluent NHibernate использовать SysCache в качестве провайдера кэша 2-го уровня:

MsSqlConfiguration.MsSql2008.ShowSql().ConnectionString(x =>
            {
                x.Server(@"localhost\ANDREPC");
                x.Database("mydb");
                x.TrustedConnection();
            }).Cache(c => c.ProviderClass<SysCacheProvider>().UseQueryCache())

Кроме того, конфигурации SysCache должны быть размещены в Web.Config:

<configuration>
 <configSections>
  <section name="syscache" type="NHibernate.Caches.SysCache.SysCacheSectionHandler,NHibernate.Caches.SysCache" />
 </configSections>

 <syscache>
  <cache region="foo" expiration="500" priority="4" />
  <cache region="bar" expiration="300" priority="3" />
 </syscache>
</configuration>

И что теперь? Что означают эти регионы? Как связать регион с типом? Как мне заставить это работать? Мои тесты jMeter показывают, что после вышеописанной конфигурации мое приложение стало на 7% медленнее, чем раньше ... Мне нужно понять SysCache и узнать, как продолжить настройку.

Спасибо.

PS: Официальная документация по SysCache здесь и не является пояснительной

1 Ответ

3 голосов
/ 20 октября 2010

В зависимости от того, что вы делаете, по умолчанию я думаю, что кэш L2 - это только элементы кэширования, вызываемые по идентификатору, EG session.Get или session.Load.Для кеширования запросов с использованием ICriteria и т. Д. Вам нужно конкретно указать, что вы хотите, чтобы этот запрос кэшировался.EG

ICriteria criteria = Session.CreateCriteria( ).SetCacheable( true ).SetCacheRegion( "SomeNameHere" );

Некоторое имя здесь - ваша область кэша.Короче говоря, это группирует элементы кеша. Сохраняя это действительно кратким, я обычно просто ставлю имя класса / сущности, например, «Персона» или «Компания».

При настройке карт классов вы всегда можете захотетьиграть со свойством Cache из базового класса.Это что-то вроде

Cache.ReadWrite( ).IncludeAll( ) ;

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

Надеюсь, это поможет.

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