NHibernate缓存和延迟加载提供不需要的结果



我在使用c#和ASP.NET的NHibernate中遇到了一些主要的缓存和延迟加载问题。直到我们启用了缓存,这种情况才开始出现。在许多情况下,为了保留所需的属性,我们必须编写代码来清空对象和新的get,否则会生成带有无效信息的文档,或者保存对象并覆盖最新的数据。

其他时候,延迟加载无法获取数据并抛出异常。在这些情况下,它总是一个具有一对多关系的对象。因此,我们有一个具有IList属性的对象,当我们遇到foreach循环时,它会抛出一个异常,指出它无法惰性加载集合。在这些情况下,我们只需执行对象的getById并实例化一个新对象。

下面是我使用的几个工作的伪代码。这些在大多数情况下都可以工作,但是,我不应该编写这些额外的代码。

对于线程应用程序:

Thread thread = new Thread(new ThreadStart(() => GetObjectNotFromCache(objectGuid, out object)));
            thread.Start();
            thread.Join();
private static void  GetObjectNotFromCache(Guid objectId, out Object object)
    {
        var db = new db() // auto generated file that handles CRUD operations
        object= db.GetObjectById(objectId);
    }

web应用:

var db = new db();
            object = db.GetObjectById(objectId);
            object = null;
            object = db.GetObjectById(objectId);

我们的会话管理器通过以下方式启用缓存:

 public static ISession OpenSession()
    {
        ISession session;
        if (CurrentSessionContext.HasBind(GetFactory()))
        {
            session = GetFactory().GetCurrentSession();
        }
        return session
    }

这些hack允许我们继续开发,然而,它们极大地减慢了我们的速度。有谁能帮忙找出这个问题可能发生在哪里吗?还有一点需要注意的是,在保存对象时,我们会退出当前会话。添加此功能是为了防止在更新后缓存持久化。这确实有助于解决问题,但并没有解决问题。

缓存对象的问题是它与当前会话断开连接。

对于web会话/请求模型,这将是一个问题。

您需要将分离的缓存对象重新连接到当前会话:

session.Lock(cachedObject, LockMode.None);

但是这抛出了潜在的并发问题,如果cachedObject在应用程序的其他地方是可写的。我建议缓存是只读数据,当你需要持久的东西,它几乎总是最好的方法来获取它新鲜,因为你正在做的。

相关内容

最新更新