什么是最佳的数据库连接策略

时间:2010-06-12 13:38:42

标签: sql-server asp.net-mvc ado.net connection-pooling

我有一个asp.net mvc网站,它为每个页面运行了许多查询。我应该打开一个连接,还是在每个查询上打开和关闭连接?

5 个答案:

答案 0 :(得分:3)

真的没关系。当您使用ADO.NET(包括Linq to SQL,NHibernate和任何其他ORM)时,库使用连接池。您可以“关闭”并“重新打开”逻辑连接十几次,但相同的物理连接将始终保持打开状态。因此,不要过多关注连接是否打开或关闭。

相反,您应该尝试限制每页必须运行的查询数,因为每次往返都会产生很大的开销。如果您在每个页面上显示相同的数据,请缓存结果,并设置缓存依赖关系或过期(如果它不经常更改)。还尝试通过使用适当的连接和/或预先加载来重用查询数据(如果您使用的是延迟加载的ORM)。

即使每次加载页面的数据总是完全不同,通过使用返回多个结果集的单个存储过程,您将获得比单独运行每个查询时更好的性能。

结论:忘记连接策略并开始担心查询策略。每页超过3-5次查询,您可能会遇到严重的问题。

答案 1 :(得分:1)

如果您在常规ADO.NET中的页面上运行多个查询,那么它们将按顺序运行,连接池将意味着无关紧要。最佳做法是按需打开连接并立即关闭它们 - 即使是同一页面中的多个查询。连接池使这相当有效。

当您使用多个查询时,通过同时打开多个连接并使用异步ADO可以显着提高性能,以确保所有请求在多个线程中同时运行。在这种情况下,您需要为每个查询建立连接。但整体连接时间会减少。

在单一连接上也有可能使用MARS,但我不是这方面的大支持者,而且功能上的限制更多。

答案 2 :(得分:0)

如果您非常确定交易将快速完成,那么请使用单个连接。

请务必检查所有返回结果,并尽可能将所有内容包装在异常处理中。

答案 3 :(得分:0)

为避免不必要的开销,最好使用单个连接。但是一定要在“try”块中运行查询并关闭“finally”块中的连接,以确保不会挂起连接。

try-finally

答案 4 :(得分:0)

的UnitOfWork ??这是一个很好的策略。 nhibernate和许多其他人使用这种模式。

为谷歌提供与您的需求相关的具体细节..

吉姆