相关疑难解决方法(0)

创建实体框架的实例在负载下减慢速度

我们注意到一些非常小的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)

c# asp.net performance entity-framework entity-framework-6

23
推荐指数
1
解决办法
1437
查看次数

适用于大量表的实体框架4.1(715)

我正在为拥有700多个表的数据库开发数据访问层.我创建了包含所有表格的模型,这些表格生成了一个巨大的模型.然后我将模型更改为使用4.1中的DBContext,这似乎改进了它的编译和工作方式.设计师似乎根本没有工作.

然后我创建了一个测试应用程序,它只是向表中添加了两条记录,但处理器在db.SaveChanges方法中达到了100%.作为一个黑匣子,很难弄清楚出了什么问题.

所以我的问题是

  1. 实体框架是大型数据库的最佳方法吗?
  2. 如果是这样,应该将模型分解为逻辑区域.我注意到你不能在多个模型中使用相同的sql表
  3. 我已经读过,在这些大型案例中,仅代码方法最好.那是什么.

任何指导都将得到真正的赞赏

谢谢

entity-framework entity-framework-4.1

11
推荐指数
1
解决办法
4500
查看次数

如何初始化我的实体框架查询以加快它们的速度?

我有一个登录页面,执行一个非常简单的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之前.我现在正试图瞥见它是否可以给我更多关于可能同时发生的其他事情的细节.

c# entity-framework-4 asp.net-mvc-4

5
推荐指数
1
解决办法
4418
查看次数