【问题标题】:caching a subsonicproject activerecord caches entire object graph缓存 subsonicproject activerecord 缓存整个对象图
【发布时间】:2012-01-23 01:52:33
【问题描述】:

我正在缓存一组活动记录行(亚音速)。当我使用 ANTS Memory Profiler 查看缓存时,我可以看到一些与我想缓存的活动记录相关的表也被缓存了。这使得缓存的项目非常大,因为额外(不需要)缓存的表。

关于如何防止这种情况的任何想法?

【问题讨论】:

    标签: asp.net caching subsonic3 subsonic-active-record


    【解决方案1】:

    我相信您将不得不修改或删除 Active Record 类中关系的延迟加载。

    延迟加载行为由 ActiveRecord.tt 模板生成,从 the most current version 的第 300 行开始:

            #region ' Foreign Keys '
    <#
                List<string> fkCreated = new List<string>();
                foreach(FKTable fk in tbl.FKTables)
                {
    
                    if(!ExcludeTables.Contains(fk.OtherTable)){
                        string propName=fk.OtherQueryable;
                        if(fkCreated.Contains(propName))
                        {
                            propName=fk.OtherQueryable+fkCreated.Count.ToString();
                        }
    
                        fkCreated.Add(fk.OtherQueryable);
    
    
    #>
            public IQueryable<<#=fk.OtherClass #>> <#=propName #>
            {
                get
                {
    
                      var repo=<#=Namespace #>.<#=fk.OtherClass#>.GetRepo();
                      return from items in repo.GetAll()
                           where items.<#=CleanUp(fk.OtherColumn)#> == _<#=CleanUp(fk.ThisColumn)#>
                           select items;
                }
            }
    
    <#
                    }
                }
    
    #>
            #endregion
    

    我会尝试删除这整个区域并查看是否解决了过多的缓存问题。当然,如果您依赖延迟加载行为,您现在就必须解决这个问题。

    【讨论】:

    • 谢谢。我不想更改活动记录模板,所以我创建了一个包装器,而不是通过 id 引用数据库中的行,以便我可以在需要时获取。
    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 2023-04-03
    • 2014-03-25
    • 1970-01-01
    • 2020-06-30
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多