Nhibernate и SetCacheable с кэшем второго уровня - PullRequest
3 голосов
/ 01 февраля 2011

Я использую репозиторий Rhino.Security для управления моими пользователями / ролями.
Процесс создания, удаления и связывания работает нормально, но я сталкиваюсь с проблемой, когда делаю запрос одним методом: GetAssociatedUsersGroupFor.
При первом вызове метода я не получаю никаких групп для своего пользователя, потому что я еще не создал никакой связи. На этом этапе я связываю пользователя с парой групп.
Я проверяю в БД и вижу ассоциацию.
Теперь я снова вызываю GetAssociatedUsersGroupFor, но не могу получить группы.
С профилировщиком я видел, что в этот раз база данных не задействована. Я проверил код и обнаружил, что функция использует Nhibernate SetCacheable:

    public virtual UsersGroup[] GetAssociatedUsersGroupFor(IUser user)
    {
        ICollection<UsersGroup> usersGroups =
            SecurityCriterions.AllGroups(user)
                .GetExecutableCriteria(session)
                .AddOrder(Order.Asc("Name"))
            .SetCacheable(true)
            .List<UsersGroup>();
        return usersGroups.ToArray();
    }

Поскольку я не хочу изменять код Rhino.Security, я хотел бы знать, могу ли я каким-либо образом переопределить или изменить это поведение.

UPDATE:

Я использую эту инструкцию для получения связанных групп:

AuthorizationRepository.GetAssociatedUsersGroupFor(User);

Я ассоциирую с этим кодом:

AuthorizationRepository.AssociateUserWith(User, grpName);

и отсоединить:

AuthorizationRepository.DetachUserFromGroup(User, groupToRemove.Name);

UPDATE

Я обнаружил, что я оставил кэш второго уровня в моей конфигурации:

<property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache</property>
<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_query_cache">true</property>

Я думал, что было бы хорошо иметь кэш II уровня для повышения производительности, но, похоже, я был совершенно неправ.
Кто-нибудь может попытаться помочь мне понять, что здесь происходит?

1 Ответ

1 голос
/ 14 февраля 2011

Проблема с rhino.security .
Мне удалось решить проблему, даже если она мне не нравится.
Я позвонил SessionFactory.EvictQueries(), когда меняю связь, и все работает нормально.

...