c# – 我们需要外部缓存机制,而EF 6使用开箱即用的缓存吗?
我最近接触过Entity Framework 6
caching mechanism.
正如我们可能从 this article开始的那样,它以First-Lever的方式实现. 我们的系统使用EF 6(代码优先)和 我们使用MemoryCache的主要原因是因为我们需要对每个页面请求执行强烈的查询.我们在每个页面请求上执行此查询x3次(在最坏的情况下),因为有客户端回调. 我想知道如果EF 6已经使用了MemoryCache机制,我们是否还需要使用MemoryCache机制. 值得一提的是,我们不使用任何特殊的缓存功能或缓存依赖项.只是一个带有超时的简单MemoryCache. 解决方法
由于各种原因,EF在上下文中缓存实体的事实绝不是“真实”缓存的替代品:
>您不应该将EF上下文重用于更多的逻辑操作,因为EF上下文代表工作单元,因此应根据此模式使用.此外,即使您出于某种原因在多个操作中重用上下文 – 您绝对不能在多线程环境中执行此操作,例如Web服务器应用程序. var entity1 = ctx.Entities.Where(c => c.Id == 1).First(); var entity2 = ctx.Entities.Where(c => c.Id == 1).First(); 尽管查询相同并返回相同的实体,但仍会对数据库执行两次查询.因此,通常意义上没有任何东西真正被“缓存”.但请注意,即使两个查询之间的数据库行已更改,两个查询也将返回相同的实体.这就是EF上下文“缓存”的含义.它将执行两次数据库查询,但第二次,在评估结果时,它会注意到已经存在具有附加到上下文的相同键的实体.因此它将返回此现有(“缓存”)实体,并将忽略第二个查询返回的新值(如果有).这种行为是不在多个操作之间重用上下文的另一个原因(尽管你不应该这样做). 因此,如果您想减少数据库的负载 – 您必须使用适合您需要的二级缓存(从简单的InMemoryCache到缓存EF提供程序到分布式memcached实例). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |