不,我的第二个问题的答案不是冬天.
前言:
我最近一直在对Entity Framework进行大量的研究,而且一直困扰着我的是它在查询没有预热时的性能,所谓的冷查询.
我浏览了Entity Framework 5.0 的性能注意事项.作者介绍的概念,温暖和寒冷的查询,以及他们如何不同,这我也注意到自己不知道它们的存在.在这里值得一提的是,我背后只有六个月的经验.
现在我知道如果我想在性能方面更好地理解框架,我还可以研究哪些主题.不幸的是,互联网上的大多数信息都是过时的或者是主观性的,因此我无法找到关于Warm vs Cold查询主题的任何其他信息.
基本上我到目前为止注意到的是,每当我必须重新编译或回收点击时,我的初始查询变得非常慢.正如预期的那样,任何后续数据读取都是快速的(主观的).
我们将迁移到Windows Server 2012,IIS8和SQL Server 2012,作为一名少年,我实际上赢得了在其他人之前测试它们的机会.我很高兴他们推出了一个预热模块,可以让我的应用程序为第一个请求做好准备.但是,我不确定如何继续升温我的实体框架.
我所知道的是值得做的:
通过常识,我认为做的可能是错误的做法:
问题:
asp.net asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5
使用:
关注点:内存使用情况
在我们目前正在进行的项目上,可能是我们的第一个更大的项目,我们经常阅读一些来自CSV导入的大块数据,这些数据可能会在很长一段时间内保持不变.
除非有人明确地重新导入CSV数据,否则它们保证是相同的,这发生在我们项目中的多个位置,并且类似的方法用于一些常常由用户读取的常规文档.我们决定将这些数据缓存在HttpRuntime缓存中.
它是这样的,我们拉大约15,000条记录,主要是字符串.
//myObject and related methods are placeholders
public static List<myObject> GetMyCachedObjects()
{
if (CacheManager.Exists(KeyConstants.keyConstantForMyObject))
{
return CacheManager.Get(KeyConstants.keyConstantForMyObject) as List<myObject>;
}
else
{
List<myObject> myObjectList = framework.objectProvider.GetMyObjects();
CacheManager.Add(KeyConstants.keyConstantForMyObject, myObjectList, true, 5000);
return myObjectList;
}
}
Run Code Online (Sandbox Code Playgroud)
检索上述方法的数据非常简单,如下所示:
public List<myObject> GetMyObjects()
{
return context.myObjectsTable.AsNoTracking().ToList();
}
Run Code Online (Sandbox Code Playgroud)
关于代码结构可能有些事情要说,但目前我并不关心这一点.
我一看到内存使用量很高就开始分析我们的项目,并发现许多部分可以优化我们的代码.我以前从未面对300个同时用户,我们自己完成的内部测试不足以显示内存问题.我已经突出显示并修复了许多内存泄漏,但我想了解一些与Entity Framework相关的未知数.
鉴于以上示例,并使用ANTS Profiler,我注意到' myObject '和其他类似对象引用了许多System.Data.Entity.DynamicProxies .myObject,此外还有许多EntityKeys可以保留整数.他们没有太多,但他们的数量相对较高.
例如,' myObject '的124个实例引用了近300个System.Data.Entity.DynamicProxies.
通常它看起来像这样,无论对象是什么: 一些缓存条目,一些我已缓存的对象,我现在注意到它们中的许多已经从dbContext事先缓存,动态代理和objectContext中分离出来.我不知道如何解开它们.

我做了一些研究,发现我可能正在缓存实体框架与这些对象相关的东西.我用NoTracking拉它们但是内存中仍然存在那些可能还有其他东西的 …
asp.net caching memory-leaks entity-framework entity-framework-5
编辑:这是一个情况的小提琴.
好的,所以我正在建立一个网页,但我遇到了一个令人恼火的字体怪癖.似乎sans-serif字体拒绝准确地坐在他们所在的盒子的左边缘.
以下是一些用于演示此问题的实验性HTML:
<html>
<head>
<style>
.box {
margin: 30px 0px 0px 30px;
border: 1px solid #f00;
}
</style>
</head>
<body style="font-size: 36px;">
<!-- text beginning with 'M', which has serifs protruding from the left side in a serif font -->
<div class="box" style="font-family: 'Segoe UI';">My text</div> <!-- sans-serif -->
<div class="box" style="font-family: 'Times New Roman';">My text</div> <!-- serif -->
<div class="box" style="font-family: 'Arial';">My text</div> <!-- sans-serif -->
<div class="box" style="font-family: 'Garamond';">My text</div> <!-- serif -->
<!-- …Run Code Online (Sandbox Code Playgroud) 双关语意图.
问题始于一个非常古老的dBase数据库,其中文本信息直接编码到DOS Cyrillic(CP-866)中,并且由于这不是一个问题,它每天晚上也被转移到MySQL数据库,我可以访问它.
我已经安装了MySQL Providers并使用Entity Framework连接到数据库,这是我的主要数据访问方法,然后出于实验原因使用纯ADO.NET.
在我试图将所谓的CP-866值从数据库转换为UTF-8之前,一切都比预期的要好,如下所示:
var cp866 = Encoding.GetEncoding(866);
var utf8 = Encoding.UTF8;
string source = "some unreadable set of characters from the database";
byte[] cp866bytes = cp866.GetBytes(source);
byte[] utf8bytes = Encoding.Convert(cp866, utf8, cp866bytes);
string result = utf8.GetString(utf8bytes);
Run Code Online (Sandbox Code Playgroud)
我用EntityFramework读了一次,用ADO.NET读了一次,结果相同.
对于当时未知和现在不太知名的原因,它没有用.在阅读了一些关于编码和字符串值的重要文章之后,我已经确定由于字符串变量本身的性质,不可能将这种转换应用于数据库中varchar字段的等效字符串.
以后几乎没有键盘爆炸,我终于通过使用ADO.NET MySQL Provider并通过将CONVERT(varcharColumn,Binary)添加到我正在测试的列来自定义我的查询.
从那时起,我使用上面的代码,唯一的区别是我已经从转换中获得了cp866字节数组.我原本打算做类似的事情,但MySQL提供程序无法直接从varchar字段读取字节,我也没有找到使用Entity Framework的方法.
是的,它有效,但即使对我没有经验的自我也感觉不对.
1:我可以指定实体框架应如何选择特定字段吗?
我想以某种方式解释我心爱的ORM,它应该在读取期间将特定varchar字段转换为二进制,而根本不返回字符串表示,因为它会混淆一切.
2:有没有办法让ADO.NET MySQL提供程序获取varchar字段的字节,而不是先将其作为字符串拉出来?
与varchar一起使用时,GetBytes方法抛出异常,并且MySQL版本中缺少通常存在于ADO.NET提供程序中的GetSqlBytes方法.我真的不想在我需要正确读取的每个字段上写二进制转换.
3:Bonus问题:是否可以像我一样读取CP-866编码的varchar字段作为字符串,但这次正确地将编码更改为UTF-8?
在今天的阅读之后,我的编码主题仍然存在很多混乱.我仍然相信可能有一些我缺少的东西,并且可以从cp-866编码的varchar字段中读取字符串,例如:
string cp866EncodedValue = "Œ€„‹… Œ‹€„…Ž‚€ Šš…‚€"; //actual copy-pasted value
Run Code Online (Sandbox Code Playgroud)
..然后将其转换为UTF-8,同时考虑到数据库中的字段是用CP-866编码的.从我所读到的,一旦它在一个字符串中,它是unicode,字符串是不可变的.我已经尝试了它的byre数组表示,将其更改为cp866,然后更改为utf8,我尝试使用它,因为它是cp866本身,但没有成功.
最近,我开始深入研究Repository Patterns和UnitOfWork的概念,同时探索EntityFramework.
基于MVC示例制作了我自己的实现,他们从Controller中处理UnitOfWork,如下所示:
protected override void Dispose(bool disposing)
{
unitOfWork.Dispose();
base.Dispose(disposing);
}
Run Code Online (Sandbox Code Playgroud)
我根本没有进入MVC,而且在Webforms中也很新,但是我认为它们会覆盖Controller dispose方法,以便将UnitOfWork作为"其他所有内容"处理掉.
基本上我想在我的ASP.NET WebForms网站中实现相同的概念,并将页面代码后面使用的UnitOfWork与处理页面本身一起处理.
我考虑过从生命周期中添加相同的Page_Unload事件,但我不确定这是否是正确的方法,因为我之前没有搞过这些事情.我的想法如下:
protected void Page_Unload(object sender, EventArgs e)
{
unitOfWork.Dispose();
base.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能安全地实现这一目标,我是否走在正确的轨道上?
asp.net dispose entity-framework unit-of-work repository-pattern
asp.net ×4
asp.net-mvc ×1
c# ×1
caching ×1
css ×1
dispose ×1
html ×1
memory-leaks ×1
mysql ×1
unit-of-work ×1