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