我需要您这些专家的确认/解释,因为我的团队告诉我“这没关系”,这让我感到沮丧 :)
背景:我们有一个SQL Server 2008,被我们的主要MVC3 / .Net4 Web应用程序使用。 在任何给定时间点有大约200多个并发用户。 服务器受到了极大的冲击(锁定,超时,总体缓慢),我正在尝试应用在我职业生涯和上一次微软认证课程中学到的东西。 这些都是我们一直在强调的事情(“立即关闭SQL连接”),我正在努力向我的团队解释,这些“小事情”,虽然单个不会有影响,但最终会累加。
我需要知道以下内容是否对性能产生影响,或者它只是“最佳实践”
1. 使用“USING”关键字。 他们的大部分代码都像这样:
public string SomeMethod(string x, string y) {
SomethingDataContext dc = new SomethingDataContext();
var x = dc.StoredProcedure(x, y);
}
尽管我试图告诉他们,使用 USING 可以更快地关闭/释放资源:
using (SomethingDataContext dc = new SomethingDataContext()) {
var x = dc.StoredProcedure(x, y);
}
他们的论点是,GC在代码执行完毕后会很好地清理垃圾,因此USING不会产生巨大影响。这是真还是假?为什么?
2. 连接池
我经常听说设置连接池可以显著加速任何网站(至少对于使用MSSQL的.Net)。我建议我们将以下内容添加到web.config中的connectionstrings:
..."Pooling=True;Min Pool Size=3;Max Pool Size=100;Connection Timeout=10;"...
他们认为,.Net/MSSQL已经在幕后设置了连接池,因此没有必要在web.config中添加它。这是真还是假?为什么其他网站都说应该添加连接池以获得最佳性能,如果它已经设置好了呢?
3. 最小化数据库调用次数
默认的.Net MVC项目提供的角色/成员资格提供程序非常好用,它可以为你处理大部分工作。但是这些人严重使用UsersInRoles()
,并像全局变量一样自由使用它(每次调用此方法时,它都会访问数据库)。
我创建了一个“用户对象”,在每个页面加载时预先加载所有角色(以及一些其他用户信息,如GUID等),然后查询此对象以查看用户是否具有该角色。
网站的其他部分有FOR语句,循环200次,并在每次通过时执行20-30个SQL查询=超过4000个数据库调用。它以某种方式在几秒钟内完成了这项工作,但我想将20-30个DB调用合并为一个,以便每个循环重复一次。但是因为SQL分析器显示查询花费了“0秒”,他们的论点是它非常快速和小型,服务器可以处理这些高数量的DB查询。
我的想法是“是的,这些查询正在快速运行,但它们正在损坏整体SQL服务器的性能。” 这可能是一个贡献因素吗?我是在担心无谓的事情,还是说这是服务器整体性能问题的(重要)贡献因素?
4. 其他代码优化
首先想到的一个是使用StringBuilder
而不是一个简单的字符串变量。我知道为什么应该使用StringBuilder
(特别是在循环中),但他们说这没有关系-即使他们需要编写10k+行,他们的论点是性能提升对他们没有影响。
总之,我们所学习和钻研的所有东西(“最小化范围!”)只是“最佳实践”,没有真正的性能提升,还是它们都导致了真正/可衡量的性能损失?
编辑***
感谢大家的回答!根据你们的回答,我有一个新问题(第五个): 他们实际上并没有使用 "USING",那么这意味着正在发生什么?如果自动发生连接池化,是不是会占用来自池的连接,直到GC出现?每个打开的与SQL服务器的连接是否都会为服务器增加一点负担并使其变慢?根据您的建议,我计划进行一些严格的基准测试/记录连接时间,因为我怀疑:a)服务器很慢;b)他们没有关闭连接;c)Profiler说它运行了0秒,缓慢可能来自于连接。
非常感谢你们的帮助。再次感谢。
var s = "a" + "b"
),那么一个字符串会更有效率。但需要记住的是,字符串实例是不可变的,所以在循环中(例如string s = "a"; for (int i = 1, i < 1000; i++) { s += "a";}
),每次循环都会创建一个新的字符串实例,这将影响内存分配并影响整体性能(是否显著取决于连接次数)。 - GarethDUsersInRoles()
方法和用+
连接字符串的方法的统计数据,并证明它们是瓶颈的原因,那么他们更可能相信你。说不定,不正确地使用StringBuilder
也导致了速度变慢。 量化分析,不要猜测。 - Jesse Webb