NHibernate и потенциальные проблемы с кэшированием - PullRequest
1 голос
/ 20 апреля 2011

Хорошо, у меня есть n многоуровневая модель. (WPF, Asp.Net и т. Д.) Для поддержки сервисов через WCF. Эти сервисы используют NHibernate для связи с базой данных. Некоторые из этих служб будут работать в режиме InstanceContextMode.Single.

Вопросы:

  1. В экземплярах синглтон-службы мне следует пытаться использовать 1 объект сеанса в течение всего времени, пока служба wcf активна, чтобы максимально эффективно использовать мой кэш?
  2. Если я использую 1 экземпляр сеанса в этом одноэлементном экземпляре и никогда не создаю новые, я предполагаю, что мне нужно беспокоиться о том, чтобы в конечном итоге удалить кэшированные объекты из сеанса или сбросить их все вместе, чтобы избежать проблем с производительностью сеанса?
  3. Целесообразно ли вообще использовать сессию таким образом для одноэлементной службы wcf? Похоже, что было бы, если я хочу использовать кэширование.
  4. Должен ли я использовать кэш 2-го уровня в подобном сценарии?
  5. За пределами этого сценария, когда мне следует избегать кэширования? Я хотел бы предположить, что я хотел бы избежать этого в любом сценарии пакетной обработки, когда большое количество объектов создается / обновляется и больше никогда не используется вне процесса создания или обновления.
  6. Будут ли элементы автоматически кэшироваться в сеансе при создании / чтении / обновлении / удалении или мне нужно что-то указывать в файлах сопоставления или конфигурации?

1 Ответ

3 голосов
/ 20 апреля 2011

1-3: Насколько мне известно, объекты ISession должны быть легковесными, недолговечными объектами, которые живут только в течение того времени, для которого они необходимы.Я бы посоветовал ПРОТИВ использовать один и тот же объект ISession в течение всего срока службы вашего сервиса.
Вместо этого я бы предложил использовать один и тот же экземпляр ISeessionFactory и создавать из него новые ISessions по мере необходимости (вы можете попробовать что-то похожее на Session-PerШаблон запроса).
Если вы включите кэш 2-го уровня, вы сможете воспользоваться всеми преимуществами кеширования в этом сценарии.

5 Да, в значительной степени.Также помните, что экземпляр кэша 2-го уровня относится к экземпляру ISessionFactory .это означает, что если вы используете более 1 экземпляра ISessionFactory, у вас будет много проблем с вашим кешем.

6 для кеша 1-го уровня вам не нужно ничего определять.
для кеша 2-го уровня вам нужно включить кеш при настройке nHibernate (свободно, в моем случае):

.Cache(c => c.UseQueryCache()
                                    .ProviderClass(
                                    isWeb ? typeof(NHibernate.Caches.SysCache2.SysCacheProvider).AssemblyQualifiedName //in web environment- use sysCache2
                                        : typeof(NHibernate.Cache.HashtableCacheProvider).AssemblyQualifiedName //in dev environmet- use stupid cache
                                    )) 
                          )

и укажите для каждой сущности и каждой коллекции, для которой вы хотите включить кэш для них:

mapping.Cache.ReadWrite().Region("myRegion");

и для коллекции:

mapping.HasMany(x => x.Something)
.Cache.ReadWrite().Region("myRegion");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...