Los*_*ear 11 .net c# sql-server asp.net-mvc sql-server-2008
我需要你的专业人士/大师的确认/解释,因为我的团队告诉我"这没关系",这让我感到很沮丧:)
背景:我们的主要MVC3/.Net4 Web应用程序正在使用SQL Server 2008.我们在任何给定点上都有大约200多个并发用户.服务器受到极大的打击(锁定,超时,整体缓慢),我正在尝试应用我在整个职业生涯和最后一次MS认证课程中学到的东西.他们是我们所有人都在钻的东西("关闭SQL连接STAT"),我试图向我的团队解释这些"小东西",虽然不是唯一一个有所作为,但最终还是加起来.
我需要知道以下是否会对性能产生影响,或者它是否只是"最佳实践"
1.使用"USING"关键字. 他们的大部分代码都是这样的:
public string SomeMethod(string x, string y) {
SomethingDataContext dc = new SomethingDataContext();
var x = dc.StoredProcedure(x, y);
}
Run Code Online (Sandbox Code Playgroud)
虽然我试图告诉他们USING会更快地关闭/释放资源:
using (SomethingDataContext dc = new SomethingDataContext()) {
var x = dc.StoredProcedure(x, y);
}
Run Code Online (Sandbox Code Playgroud)
他们的论点是GC在代码执行完毕后做了很好的清理工作,因此USING没有产生巨大的影响.是真还是假?为什么?
2.连接池
我一直听说设置连接池可以显着加快任何网站(至少.Net w/MSSQL).我建议我们在web.config中的connectiontring中添加以下内容:
..."Pooling = True; Min Pool Size = 3; Max Pool Size = 100; Connection Timeout = 10;"......
他们的论点是.Net/MSSQL已经在幕后设置了连接池,没有必要放入我们的web.config.对或错?为什么每个其他网站都说如果已经设置了池,那么应该添加池以获得最佳性能?
3.最小化对DB的调用次数
默认的.Net MVC项目附带的角色/成员资格提供程序很不错 - 它非常方便,可以为您完成大部分工作.但是这些人正在认真UsersInRoles()
地使用它并像一个全局变量一样自由地使用它(每次调用这个方法时它就会击中数据库).我创建了一个"用户对象",它在每个页面加载(以及其他一些用户的东西,如GUID等)上预先加载所有角色,然后查询该对象是否具有该角色.
该网站的其他部分有FOR语句循环超过200次,并在每次传递=超过4,000个数据库调用时执行20-30个sql查询.它以某种方式在几秒钟内完成,但我想要做的是将20-30个DB调用合并为一个,这样它就可以进行200次调用(每个循环).但是因为SQL分析器说查询花了"0秒",所以它们的论点是它如此快速和小,以至于服务器可以处理这些大量的数据库查询.
我的想法是"是的,这些查询运行速度很快,但它们会破坏整个SQL服务器的性能." 这可能是一个促成因素吗?我是否担心什么,或者这是服务器整体性能问题的重要因素?
4.其他代码优化
首先想到的是使用StringBuilder
vs一个简单的字符串变量.我理解为什么我应该使用StringBuilder
(特别是在循环中),但是他们说这没关系 - 即使他们需要写10k +行,他们的论点是性能增益无关紧要.
总而言之,我们所学到的所有东西都已深入到我们身上("最小化范围!")只是"最佳实践"而没有真正的性能提升,或者它们是否都会导致实际/可衡量的性能损失?
编辑*** 谢谢大家的所有答案!我根据你的答案提出了一个新的(第五个)问题:他们实际上并没有使用"USING",那么这意味着什么呢?如果连接池自动发生,它是否会从池中连接到GC到来之前?是否可能每个与SQL服务器的开放连接都会给服务器增加一点负担并减慢它的速度?
根据你的建议,我计划对连接时间做一些严格的基准测试/记录,因为我怀疑a)服务器很慢,b)他们没有关闭连接和c)Profiler说它在0秒内运行,速度慢可能来自连接.
我真的很感谢你的帮助.再次感谢
对代码进行分支,根据当前代码库进行更改和基准测试+配置文件.然后你会得到一些证据来支持你的说法.
至于你的问题,这里有:
你应该总是手动处理实现的类IDisposable
,GC实际上不会调用dispose,但是如果类也实现了终结器,那么它将调用终结器,但是在大多数实现中它们只清理非托管资源.
确实,.NET框架已经进行了连接池,我不确定默认值是什么,但连接字符串值只是允许你改变它们.
SQL语句的执行时间只是故事的一部分,在SQL分析器中,您将看到数据库引擎执行查询所花费的时间,您缺少的是Web服务器连接所需的时间.并从数据库服务器接收结果,因此查询可能很快,您可以通过批处理查询节省大量的IO和网络延迟.
这个是一个很好的一个来进行一些分析,以证明串联构建器上连接所使用的额外内存.
归档时间: |
|
查看次数: |
6250 次 |
最近记录: |