从视图模型并行调用SQL Server数据库

时间:2016-08-09 18:16:01

标签: asp.net-mvc sql-server-2008 asynchronous

我有简单的视图模型,它自己填充,但问题是网页包含很多选择列表,并且对于每个选择列表,我调用数据库过程来获取数据列表。

为了提高性能,是否可以异步或并行执行数据库调用?

我有这样的代码:

[forbiddenapis] Forbidden method invocation: java.text.MessageFormat#format(java.lang.String,java.lang.Object[]) [Uses default locale]
[forbiddenapis]   in org.a.b.MyClass (MyClass.java:813)    

正如您所看到的,_list3正在等待_list2而_list2正在等待_list1,这可能会减慢请求的速度。视图模型自身填充的原因是因为在实际场景中这些选择列表彼此相关,并且模型包含有关所选ID的信息,并且使用这些ID我可以重建选择列表,例如,如果模型验证失败。

有什么想法吗?我可以使用一些异步等待方法,在这种情况下它能帮助我对抗SQL Server 2008吗?

1 个答案:

答案 0 :(得分:1)

您可以使用任务并行库Paralle.Invoke方法并行执行许多任务。

Parallel.Invoke(() =>{
    // Execute some code here    
}, () =>
{
     // Execute some other code here  
});

我个人不会将具体的DbContext对象传递给我的视图模型。查看模型应该是简单的POCO。它不应该对您的数据访问技术有任何了解。所以我个人的偏好是保持数据访问代码与我的视图模型分开。所以我永远不会在视图模型构造函数中使用像您这样的具体对象从数据库中读取值。

假设您有一个像这样的简单POCO视图模型

public class CreateViewModel
{
  public List<SelectListItem> States {set;get;}
  public List<SelectListItem> UserTypes {set;get;}
}

在GET操作中,您可以使用Parallel.Invoke加载2个属性数据。

var vm = new CreateViewModel();
Parallel.Invoke(() =>{
    vm.States = db.States.Select(s=>new SelectListItem { Value=s.Id.ToString(), 
                                                         Text=s.Name }).ToList();
}, () =>
{
    vm.UserTypes= db.UserTypes.Select(s=>new SelectListItem { Value=s.Id.ToString(),
                                                              Text=s.Name }).ToList();
});
return View(vm);

缓存

如果这些是经常访问的下拉项目,我建议您缓存此数据,而不是每次都查询数据库表。您可以考虑使用默认的MemoryCache