【问题标题】:NHibernate caching issue - When to call Evict?NHibernate 缓存问题 - 何时调用 Evict?
【发布时间】:2012-10-19 08:49:27
【问题描述】:

我遇到了一个明显的缓存问题,即 NHibernate 返回的内容与数据库中的内容不匹配。

我相信这是二级缓存数据。看起来我可以使用 Evict 来执行此操作,但是 何时应该实际调用 Evict 方法? 对于我的特定应用程序,数据对于用户来说是唯一的,并且提供的数据可能是唯一的只会使用一次*。

我可以完全禁用这些对象集的 Level2 缓存吗?

10/31 更新

我的场景是这样的:我有一个购物车,客户将在其中添加和删除商品。我正在做的事情如下:在处理购物车的更新之前,我驱逐了Cart 和CartProduct 实体。完成后,我从提供程序检索CartProducts 列表并返回视图(这发生在 .NET MVC 控制器中)。

11/3 更新

购物车已经完成,我遇到了一个似乎与同一个 NHibernate 问题有关的问题,但实际上是一个 MVC 问题。深入挖掘发现 HTML Helper 扩展覆盖了我假设的值并替换为 Model 状态中的值。所以对这个是双重打击。希望这对某人有所帮助。

【问题讨论】:

    标签: asp.net-mvc nhibernate caching evict


    【解决方案1】:

    不,您不能禁用某些实体的缓存。

    你确实有几个选择:

    1. 使用 ISession.Clear() 从 NHibernate 的缓存中清除所有实体。
    2. 使用 ISession.Evict(obj) 从缓存中清除特定实体。
    3. 使用 ISessionFactory.Evict( typeof( obj ) ) 从缓存中逐出特定类型的所有实体/对象。在我看来,这将是最接近您想要的。
    4. 使用 IStatelessSession 从数据库中获取对象/实体,因为这完全绕过了所有缓存。

    【讨论】:

    • 兰迪,感谢您的链接。您能否详细说明 evit 的正确/预期用法?我在上面对我的实际使用做了一些注释,但这似乎是一种完全错误的做法。在对 DB 做任何事情之前不得不打电话给 Evict 对我来说是荒谬的。使用 MySQL FWIW。
    • Evict() 从 NHibernate 会话中删除/取消关联对象。它的预期用途是当您不希望将对象持久/保存回数据库时。例如,您可以从数据库中加载现有的购物车,Evict() 购物车实体并将购物车实体保存在会话中。然后,当用户到达购物车的末尾时,您可以将其保存回数据库。该示例将允许您的购物车不必在每次页面更改时从数据库中重新加载。这是一个人为的例子,但听起来很合理。
    • 关于您的第二条评论和对您的问题的更新,是的,似乎有些东西没有正确设置,因为您真的不需要为您的用例从会话中驱逐对象.不幸的是,在我们缩小真正的问题范围之前,我需要对您的应用程序有相当多的了解。有些事情需要调查,确保您没有使用与视图模型相同的实体,确保您正在使用事务,确保在处理您的 NHibernate 会话之前正确提交事务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多