Asp.net mvc 4 实体框架只允许一个查询

Asp.net mvc 4 实体框架只允许一个查询,asp.net-mvc-4,entity-framework-4,Asp.net Mvc 4,Entity Framework 4,我正在通过实体框架调用SQL数据库,执行此调用大约需要2分钟。 我想确保此呼叫只发生一次。调用完成后,我将结果放在缓存中。我注意到,如果站点上有多个用户,返回数据可能需要2分钟以上,那么最好的方法是什么?我应该使用互斥锁吗?或者实体框架(版本4)是否内置了任何功能来处理这种情况。我正在使用MVC4。谢谢大家! public IEnumerable<AdListing> AllActiveAds() { try { if (PullCache(Constants

我正在通过实体框架调用SQL数据库,执行此调用大约需要2分钟。 我想确保此呼叫只发生一次。调用完成后,我将结果放在缓存中。我注意到,如果站点上有多个用户,返回数据可能需要2分钟以上,那么最好的方法是什么?我应该使用互斥锁吗?或者实体框架(版本4)是否内置了任何功能来处理这种情况。我正在使用MVC4。谢谢大家!

public IEnumerable<AdListing> AllActiveAds()
{
    try
    {
    if (PullCache(Constants.CacheKeys.AllActiveAds) == null)
    {
        using (var db = new MyEntities())
        {
            db.CommandTimeout = 300;

            List<AdListing> results =
                (from a in
                     db.AdListings
                       .Include("AdPhotos")
                       .Include("tbLocation")
                 where !a.Deleted
                 select a).ToList();

            PushCache(results, Constants.CacheKeys.AllActiveAds);
        }
    }
    return (List<AdListing>) PullCache(Constants.CacheKeys.AllActiveAds);
    }
    catch (Exception ex)
    {
        HandleException(ex);
        return null;
    }
}
public IEnumerable AllActiveAds()
{
尝试
{
if(PullCache(Constants.CacheKeys.allactiveeads)=null)
{
使用(var db=new MyEntities())
{
db.CommandTimeout=300;
列出结果=
(来自一家英国公司)
db.AdListings
.包括(“AdPhotos”)
.包括(“tbLocation”)
哪里!删除了
选择一个.ToList();
PushCache(结果、常量、CacheKeys、AllActiveAds);
}
}
return(List)PullCache(Constants.CacheKeys.allactiveeads);
}
捕获(例外情况除外)
{
手部异常(ex);
返回null;
}
}

假设您不想对网站进行单一访问,则每个进程都将与数据库通信。因此,如果您构建了一个进程范围的缓存并与之通信,那么您将与数据库自己的缓存竞争。如果加载数据的后处理速度足够慢,这是有意义的,但这是一个滑坡。大部分时间花在哪里?。返回多少个条目。是一个SQL跟踪。你有没有考虑过一种不同的方法,而不是同时处理所有列表和所有照片?实际上,我正在考虑打一个db电话,而不是使用所有照片。一个列表可以有多张照片,在大多数情况下,我只需要显示一张照片作为主要照片,并且在用户单击详细视图之前不返回所有照片。你知道如何使用上面的语法实现这一点吗?我希望使用OrderBy,使用skip Iqueryable功能一次获取列表和主照片1页。为什么要阅读超出页面的内容?我甚至不在两次通话之间保留DBContext。如果你打算缓存这些信息,你可能会被一个慢死网站所利用。按需阅读。我也建议你考虑使用Ajax来获取为什么查询这么慢?您可能想查询大量数据,或者数据库后端有问题。试着优化它。尝试创建一个查询相同数据但速度更快的自定义数据库视图。用它做实验。建立索引。您可以在2分钟内查询数百万条记录。