NHibernate和SetCacheable与二级缓存

3
我正在使用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);

并分离:

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>

我曾认为拥有一个二级缓存可以提高性能,但看来我完全错了。
是否有人可以帮我理解这里发生了什么?


你可以发布一下你的代码,在那里保存新的关联以及随后检索它们吗? - nkirkes
@mannish:我已经附上了代码。它非常简单。正如我所说,我可以在数据库中找到记录,所以一切都很正常。我已经重新编译了Rhino.Security模块,并在这里添加了注释:.SetCacheable(true),一切都正常,但我想避免这种情况。 - LeftyX
只是为了明确,这是在单独的NHib会话中进行的,对吗?您不是在单个会话下完成所有操作吧?如果记录最终出现在数据库中,我假设它们是不同的会话/事务。 - nkirkes
@mannish: 是的,因为我的应用程序是ASP.NET MVC。我打开一个会话并保存数据。然后关闭会话。如果我尝试更改数据,我会打开另一个会话,获取数据并发现查询返回先前保存之前的信息。 - LeftyX
1个回答

1

rhino.security 有问题。
我已经设法解决了这个问题,尽管我不太喜欢它。
当我改变关联时,我调用了SessionFactory.EvictQueries()并且一切都运行良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接