我们注意到一些非常小的Web服务调用花费的时间比我们预期的要长.我们做了一些调查并安排了一些定时器,我们将其缩小到创建我们的Entity Framework 6 DbContext的实例.不是查询本身,只是创建上下文.我已经把一些日志记录平均看到创建一个DbContext实例需要多长时间,它似乎是大约50ms.
应用程序预热后,上下文创建速度不慢.应用程序回收后,它开始时间为2-4毫秒(这是我们在开发环境中看到的).上下文创建似乎随着时间的推移而变慢.在接下来的几个小时内,它将爬升到50-80ms的范围并保持平稳.
我们的上下文是一个相当大的代码优先上下文,包含大约300个实体 - 包括一些实体之间的一些非常复杂的关系.我们正在运行EF 6.1.3.我们正在执行"每个请求一个上下文",但对于我们的大多数Web API调用,它只执行一个或两个查询.创建一个60 + ms的上下文,然后执行1ms的查询有点不满意.我们每分钟有大约10k个请求,所以我们不是一个很少使用的网站.
这是我们所看到的快照.时间在MS,最重要的是部署回收app域.每行是4个不同的Web服务器之一.请注意,它并不总是相同的服务器.
我确实采取了内存转储尝试充实了正在发生的事情,这里是堆统计信息:
00007ffadddd1d60 70821 2266272 System.Reflection.Emit.GenericFieldInfo
00007ffae02e88a8 29885 2390800 System.Linq.Enumerable+WhereSelectListIterator`2[[NewRelic.Agent.Core.WireModels.MetricDataWireModel, NewRelic.Agent.Core],[System.Single, mscorlib]]
00007ffadda7c1a0 1462 2654992 System.Collections.Concurrent.ConcurrentDictionary`2+Node[[System.Object, mscorlib],[System.Object, mscorlib]][]
00007ffadd4eccf8 83298 2715168 System.RuntimeType[]
00007ffadd4e37c8 24667 2762704 System.Reflection.Emit.DynamicMethod
00007ffadd573180 30013 3121352 System.Web.Caching.CacheEntry
00007ffadd2dc5b8 35089 3348512 System.String[]
00007ffadd6734b8 35233 3382368 System.RuntimeMethodInfoStub
00007ffadddbf0a0 24667 3749384 System.Reflection.Emit.DynamicILGenerator
00007ffae04491d8 67611 4327104 System.Data.Entity.Core.Metadata.Edm.MetadataProperty
00007ffadd4edaf0 57264 4581120 System.Signature
00007ffadd4dfa18 204161 4899864 System.RuntimeMethodHandle
00007ffadd4ee2c0 41900 5028000 System.Reflection.RuntimeParameterInfo
00007ffae0c9e990 21560 5346880 System.Data.SqlClient._SqlMetaData
00007ffae0442398 79504 5724288 System.Data.Entity.Core.Metadata.Edm.TypeUsage
00007ffadd432898 88807 …Run Code Online (Sandbox Code Playgroud) 我正在为拥有700多个表的数据库开发数据访问层.我创建了包含所有表格的模型,这些表格生成了一个巨大的模型.然后我将模型更改为使用4.1中的DBContext,这似乎改进了它的编译和工作方式.设计师似乎根本没有工作.
然后我创建了一个测试应用程序,它只是向表中添加了两条记录,但处理器在db.SaveChanges方法中达到了100%.作为一个黑匣子,很难弄清楚出了什么问题.
所以我的问题是
- 实体框架是大型数据库的最佳方法吗?
- 如果是这样,应该将模型分解为逻辑区域.我注意到你不能在多个模型中使用相同的sql表
- 我已经读过,在这些大型案例中,仅代码方法最好.那是什么.
任何指导都将得到真正的赞赏
谢谢
我有一个登录页面,执行一个非常简单的EF查询来确定用户是否有效.在第一次运行时,此查询大约需要6秒才能运行.在后续运行中,它需要不到一秒钟.
我看过一篇谈论使用Application Auto-Start的文章,我的问题是这样的:有没有办法触发这个查询,无需实际调用查询就会导致任何缓存需求,或者我是否有必要用一组虚拟参数调用查询?
编辑:当我说六秒钟时,我指的是获取查询所需的时间.代码看起来像这样(注意,在这种情况下,contactID是一个可以为null的int并设置为null):
return from contact in _context.Contacts
where contact.District == Environment.District &&
contact.ContactId == (contactID ?? contact.ContactId)
select contact;
Run Code Online (Sandbox Code Playgroud)
这是一个SqlServer 2008,我运行一个分析器来检查SQL,它返回的持续时间是41ms,最终执行的查询.6或7秒延迟发生在查询甚至到达SQL之前.我现在正试图瞥见它是否可以给我更多关于可能同时发生的其他事情的细节.