gpt4 book ai didi

entity-framework - EF Provider Wrappers 的 Entity Framework 和二级缓存

转载 作者:行者123 更新时间:2023-12-04 07:21:31 32 4
gpt4 key购买 nike

我正在尝试让二级缓存与 Entity Framework 4 一起使用。Jarek Kowalski (http://code.msdn.microsoft.com/EFProviderWrappers/Release/ProjectReleases.aspx?ReleaseId=4747) 制作的“EF Provider Wrappers”工作得很好,我遇到的问题是表中的所有缓存条目都无效为对表进行更新后。这是有意的,还是我在实现中犯了错误?

如果这是有意的,那么它在有很多更新的表上完全没用。有没有办法解决这个问题?

这是我实现的 ICache 接口(interface),使用 ScaleOut StateServer 作为缓存:

    public class SossCache : ICache
{
private readonly NamedCache SossCache;

public SossCache(string cacheName)
{
this.SossCache = CacheFactory.GetCache(cacheName);
}

public bool GetItem(string key, out object value)
{
value = this.SossCache.Get(key);
return value != null;
}

public void PutItem(string key, object value, IEnumerable<string> dependentEntitySets, TimeSpan slidingExpiration, DateTime absoluteExpiration)
{
bool isAbsoluteTimeout = slidingExpiration == TimeSpan.Zero;
TimeSpan timeout = isAbsoluteTimeout ? absoluteExpiration.Subtract(DateTime.Now) : slidingExpiration;

CreatePolicy createPolicy = new CreatePolicy(timeout, isAbsoluteTimeout, ObjectPreemptionPriority.Normal, dependentEntitySets.ToArray(), true);
this.SossCache.Insert(key, value, createPolicy, true, false);
}

public void InvalidateItem(string key)
{
this.SossCache.Remove(key);
}

public void InvalidateSets(IEnumerable<string> entitySets)
{
foreach (string key in entitySets)
InvalidateItem(key);
}
}

最佳答案

是的,这是故意的。作者在同一个link中提到过你已经分享了。

“EFCachingProvider 有点复杂。它使用外部缓存实现并缓存在 DbCommand.ExecuteReader() 中执行的所有查询查询的结果。 每当检测到更新(UPDATE、INSERT 或 DELETE)时,提供程序都会使受影响的缓存失效通过逐出依赖于任何更新表的所有缓存查询来记录条目。"

我不确定您的情况有什么干净的解决方案。但是,如果您的表非常频繁地更新,则最好不要缓存该表的条目。您可以使用“CustomCachingPolicy”将该表排除在缓存之外。

“CustomCachingPolicy – 包括用户可配置的应该和不应该缓存的表列表 ,以及过期时间和结果大小限制。”

关于entity-framework - EF Provider Wrappers 的 Entity Framework 和二级缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4876115/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com