我在Azure移动应用 Web API 的ApiController 请求中有这行代码:
var user = t.TrackDependency(() => context.Users.SingleOrDefault(x => x.Email == loginRequest.Id || x.Name == loginRequest.Id), "GetUser");
以下是Application Insights的结果:
我们可以看到,虽然代码行占用了2613ms,但对数据库的实际查询调用耗时190ms。虽然这是一个边缘情况,但它经常足以让抱怨用户表现缓慢。
事情是我不知道差异可能来自哪里。请注意,这不是由于冷启动,当这个确切的呼叫发生时应用程序是温暖的。
第二行是对数据库端点的实际调用。在此之前,它与数据库无关。
ps:图表来自应用程序见解。它们捕获对数据库的调用,并通过TrackDependency
方法添加我的onwn数据。
更新
今天,由于Application Insights采样(很棒的工具!),我获得了更多数据。 以下是结果(这不是确切的请求调用实例,但这是同样的问题):
它清楚地表明context.Database.CompatibleWithModel(false)
是罪魁祸首。通过调用我InitializeDatabase
自定义实现的IDatabaseInitializer
来调用它。我的自定义初始化程序设置为Startup
我在same issue
为什么需要这么长时间?
InitializeDatabase
并不总是被调用,我不知道它什么时候被调用以及为什么被调用。
我找到了另一个罪魁祸首:
现在我们看到EntityConnection.Open
正在等待某事。连接上有锁吗?到目前为止,仍未对数据库端点进行调用,因此我们仍然在此处EntityFramework
。
更新2
该帖子中有两个问题:
CompatibleWithModel
会变慢?有很多关于启动时间改进的文章。这个SOF问题并未得到解决。EntityConnection.Open
会被阻止。这与EntityFramework无关,但如果在5分钟的窗口内没有调用连接,则通常需要3秒钟。我在特定的post中提出了这个问题。
因此,该帖子中没有其他问题可以删除,但可能仍然可用作跟踪Web Api呼叫中丢失时间的分析。