gpt4 book ai didi

NHibernate 按 id 驱逐

转载 作者:行者123 更新时间:2023-12-04 13:55:13 27 4
gpt4 key购买 nike

每个人都知道 session 中有缓存。
这个缓存通常可以通过两种方法清除:

  • Session.Evict
  • Session.Clear

  • 第二种方法不仅删除单个条目的所有缓存。

    我有商业方法。它接收大对象的 id(来自 aspx 站点)或有时几个 id。并在数据库中进行 native sql 操作(使用具有复杂逻辑的 sql-query 不加载 C# 中的所有数据)。然后我需要使缓存无效。因此,每个潜在的对象负载都没有直接来自数据库的缓存。

    不幸的是,驱逐只接受对象。此外,它的实现 DefaultEvictEventListener 在代码路径中有明确的分离 - 代理和非代理类分开。我试图简单地创建实体,手动填写 id 并将其传递给 Evict。这行不通。据我了解,通过非代理类 Evict 使用 GetHashCode 从缓存中查找和删除对象。因此,如果我不覆盖它,它将无法正常工作。我有很多 native sql 批处理操作,因此覆盖所有实体对象中的所有 GetHashcode 将创建大量工作。另外我不确定这种情况是否从缓存中删除了代理或没有。
    更新:据我尝试覆盖 GetHashCode 也没有帮助。 StatefulPersistenceContext.RemoveEntry 未找到实体,因为它使用 RuntimeHelpers.GetHashCode。所以这个解决方案甚至是不可能的

    使用 NHibernate 的来源,我产生了以下解决方案:
    public static class NHSessionHelper: DefaultEvictEventListener
    public static void RemoveEntityFromCache(this ISession session, Type type, object entityId)
    {
    ISessionImplementor sessionImpl = session.GetSessionImplementation();
    IPersistenceContext persistenceContext = sessionImpl.PersistenceContext;
    IEntityPersister persister = sessionImpl.Factory.GetEntityPersister(type.FullName);

    if (persister == null)
    {
    return;
    }

    EntityKey key = new EntityKey(entityId, persister, sessionImpl.EntityMode);
    persistenceContext.RemoveProxy(key);

    object entity = persistenceContext.RemoveEntity(key);
    if (entity != null)
    {
    EntityEntry e = persistenceContext.RemoveEntry(entity);
    DoEvict(entity, key, e.Persister, (IEventSource)sessionImpl);
    }
    }

    它只是使用 NHibenate 实现的一部分。但在我看来复制代码不是个好主意。可能有人有其他想法吗?

    最佳答案

    如果您确定该对象在缓存中,Session.Get(id)不会击中分贝。这样做可能最简单,然后 Evict你回来的对象:

    Model m = Session.Get(id);
    Session.Evict(m);

    编辑

    我不清楚你说的是一级缓存还是二级缓存。以上将从一级缓存中驱逐某些内容。要从二级缓存中驱逐,请使用 SessionFactory 上的 evict 方法。 .

    编辑回复评论

    在这种情况下,您可以尝试 Session.Load :
    Model m = Session.Load(id);
    Session.Evict(m);

    m在缓存中, Session.Load将返回您可以驱逐的实例。如果不是,它返回一个代理(没有数据库命中)。我的测试表明 Session.Evict如果您尝试驱逐代理,则不会抛出,所以这应该有效。

    关于NHibernate 按 id 驱逐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4107130/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com