【问题标题】:what is the optimal database connection strategy什么是最佳的数据库连接策略
【发布时间】:2010-06-12 13:38:42
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    真的没关系。当您使用 ADO.NET(包括 Linq to SQL、NHibernate 和任何其他 ORM)时,该库使用连接池。您可以多次“关闭”和“重新打开”一个逻辑连接,但同一物理连接将始终保持打开状态。所以不要太在意连接是打开还是关闭。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      也有可能在单个连接上使用 MARS,但我不是这个的主要支持者,而且它在功能上受到更多限制。

      【讨论】:

        【解决方案3】:

        如果您相当确定事务将很快完成,请使用单个连接。

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

        【讨论】:

        • @我应该只存储一个缓存的连接对象
        【解决方案4】:

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

        try-finally

        【讨论】:

          【解决方案5】:

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

          给它一个谷歌搜索与您的需求相关的具体细节..

          吉姆

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-29
            • 2010-09-08
            • 2010-09-06
            • 2016-04-06
            • 2015-12-13
            • 2014-05-29
            • 1970-01-01
            • 2011-05-27
            相关资源
            最近更新 更多