【问题标题】:LinqToSql DataContext cache and memory usageLinqToSql DataContext 缓存和内存使用情况
【发布时间】:2012-02-02 12:42:29
【问题描述】:

我想知道 LINQ to SQL DataContext 缓存是否使用 WeakReference 或类似系统以避免在几次请求后使用过多内存?

此行为是否取决于 ObjectTrackingEnabled 属性?

【问题讨论】:

    标签: .net linq linq-to-sql caching datacontext


    【解决方案1】:

    没有;它使用常规引用,因为通常它需要保留对象以执行更改跟踪(正如您提到的),而且身份管理器也可以工作。

    但是,这不是问题 - 因为您只是打算短暂使用 DataContext 实例作为工作单元。因为否则,更改跟踪器/身份管理器的开销很快就会使数据上下文完全膨胀且无法使用(太慢)。

    所以;只需简单地使用数据上下文,并在操作完成后收集对象。不要随意掌握数据上下文。

    有时,您根本不需要数据上下文;对于以读取为主的应用程序,有替代但类似的查询机制。

    【讨论】:

    • 你能举一个替代但相似的查询机制的例子吗?
    • @bzlm 用一个对不同的人有不同含义的术语来说,“微型 ORM”,例如 dapper-dot-net、PetaPoco、mass 和 Simple.Data,可能是很有用。我参与了 dapper(-dot-net),我们专门编写它以允许我们重用我们的 LINQ-to-SQL 类,但没有 L2S 的开销。
    • 谢谢,我已经必须在我的 L2S DataContext 中使用 PetaPoco。我对这种行为有点失望,我知道我们应该使用的工作单元模式,但是鉴于您不能(轻松)在不同实例之间共享 IQueryables 或实体,它在某些情况下变得无用(至少对我来说)。对于 IQueryable 问题,我想我会尝试用 Linq.Expression 参数替换它们。
    • 讨论这背后的设计决策:imo 跟踪实体应该不是问题,ChangeSet 硬引用对我来说已经足够了(您不需要保留对未更改的非引用实体的引用)。
    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多