所以这是代码:
using(var dbContext = contextFactory.GetContext())
{
foreach(item in dbContext.Items)
{
try
{
var result = IRemoteWebService.SomeOperation(item);
}
catch(MyException e)
{
//assume that all possible exceptions are caught
}
}
}
问题:据我所知,这样做的唯一可能问题是http呼叫超时,对于使用DbContext
内部的初始Web请求和Web请求,这可能会有所不同。这样做有什么其他可能的缺点?
答案 0 :(得分:1)
这被认为是不好的做法,因为你正在混合责任。调用HTTP服务时,您的数据库连接保持打开状态。
使其更具体:想象一下HTTP服务器中的停顿以及此特定功能的高负载。在这种情况下,您将同时打开多个数据库连接。这可能会导致不必要的副作用。例如Record locking
(特别是当您还使用写入操作时)或者甚至可以达到最大数据库连接数。
更好的方法是首先获取数据,然后调用HTTP服务。代码可能看起来更像这样:
List<Items> items = null;
using(var dbContext = contextFactory.GetContext())
{
items = dbContext.Items.ToList(); //query all the items
}
//now loop the items
foreach(item in items )
{
try
{
var result = IRemoteWebService.SomeOperation(item);
}
catch(MyException e)
{
//assume that all possible exceptions are caught
}
}
如果您创建sepperate方法(甚至将它们放在不同的类中),对于您的数据查询和http-call,会更好。这样,您可以更好地重用代码,并且更易于维护,更灵活,更易于测试。
至于一般注意事项:最好尽可能在最短的时间内保持连接(db,http,tcp / ip,文件系统等),图形,锁等操作。当然有性能优化参数可以证明这个陈述,但这些参数很少有效,因为代码复杂性会增加其代价。