从自定义缓存中检索的多对一关系

时间:2012-02-03 17:54:39

标签: nhibernate caching fluent-nhibernate

这更像是理论问题。

我有一个表来保存字典项,下一个用于保存用户数据。 用户表包含很多在字典项表上指示的多对一类型的引用列。看起来像是:

public class User
{
public int Id;
public Dictionary Status;
public Dictionary Type;
public Dictionary OrganizationUnit;
......
}

我希望在启动时检索所有字典,然后当我检索用户并调用引用属性到字典时,应该从缓存中获取字典对象。

我知道在这种情况下我可以使用二级缓存,但我对其他解决方案感兴趣。有没有?

我可以自定义类型并说:使用我的自定义缓存来检索字典值

2 个答案:

答案 0 :(得分:0)

在多个会话中,二级缓存是最好的答案,在不使用二级缓存的情况下从缓存填充对象的唯一其他解决方案我可以想到将使用onLoad拦截器(并简单地将您的字典保留为未映射)或在你的应用程序的某个地方手动完成。

但是你为什么不想使用seocondlevel缓存呢?如果您对缓存的看法与存储有很大不同,那么在hibernate中有提供者可以实现您自己的提供者吗?

答案 1 :(得分:0)

为什么不将它存储在会话中?只需拉一次记录集并将其推入会话并在每次需要时检索它。我为其他东西做了类似的事情,我相信我的方法应该适合你。在我的代码中,我有一个会话管理器,我直接从任何一段代码调用需要会话值。我选择这种方法,因为我可以查询结果,我可以操纵存储和检索方法。当我依靠NHibernate为我做缓存时,我没有控件的粒度来使特定的记录集只能用于特定的会话。我还发现NHibernate不如直接使用会话那么高效。在分析CPU和内存使用情况时,我发现此方法更快并且使用的内存更少。如果你想在网站级别而不是会话上进行,请查看HttpContext.Current.Cache。

以下示例适用于存储和检索记录集:

// Set the session
SessionManager.User = (Some code to pull the user record with relationships.  Set the fetch mode to eager for each relationship else you will just have broken references.)

// Get the session
User myUser = SessionManager.User;



public static class SessionManager
{
    public static User User
    {
        get { return GetSession("MySessionUser") as User; }
        set { SetSession("MySessionUser", value); }
    }

    private static object GetSession(string key)
    {
        // Fix Null reference error
        if (System.Web.HttpContext.Current == null || System.Web.HttpContext.Current.Session == null)
        {
            return null;
        }
        else
        {
            return System.Web.HttpContext.Current.Session[key];
        }
    }

    private static void SetSession(string key, object valueIn)
    {
        // Fix null reference error
        if (System.Web.HttpContext.Current.Session[key] == null)
        {
            System.Web.HttpContext.Current.Session.Add(key, valueIn);
        }
        else
        {
            System.Web.HttpContext.Current.Session[key] = valueIn;
        }
    }
}