加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 我们需要外部缓存机制,而EF 6使用开箱即用的缓存吗?

发布时间:2020-12-15 23:38:10 所属栏目:百科 来源:网络整理
导读:我最近接触过Entity Framework 6 caching mechanism. 正如我们可能从 this article开始的那样,它以First-Lever的方式实现. 我们的系统使用EF 6(代码优先)和 MemoryCache 来提高性能. 我们使用MemoryCache的主要原因是因为我们需要对每个页面请求执行强烈的查
我最近接触过Entity Framework 6 caching mechanism.
正如我们可能从 this article开始的那样,它以First-Lever的方式实现.

我们的系统使用EF 6(代码优先)和MemoryCache来提高性能.

我们使用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实例).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读