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");