具有二级缓存的Nhibernate和SetCacheable

时间:2011-02-01 16:28:03

标签: nhibernate second-level-cache rhino-security

我正在使用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代码,我想知道我是否可以以任何方式覆盖或更改此行为。

更新

我使用此指令获取关联组:

AuthorizationRepository.GetAssociatedUsersGroupFor(User);

我与此代码相关联:

AuthorizationRepository.AssociateUserWith(User, grpName);

and detach:

AuthorizationRepository.DetachUserFromGroup(User, groupToRemove.Name);

更新

我发现我在配置中留下了二级缓存:

<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 个答案:

答案 0 :(得分:1)

rhino.security存在问题 即使我不喜欢,我也设法解决了这个问题 当我改变一个关联并且一切正常时,我打电话给SessionFactory.EvictQueries()