【问题标题】:Opening the database connection once or on every databaseaction?一次或在每个数据库操作上打开数据库连接?
【发布时间】:2010-10-11 07:03:45
【问题描述】:

我目前正在使用严重依赖数据库使用的 ASP.NET 创建一个 webportal。基本上,来自任何用户的每个(以及几乎每个 :P )GET 查询都会导致从网络服务器对数据库的查询。

现在,我在这方面真的很陌生,而且我非常关心性能。由于我缺乏这方面的经验,我真的不知道会发生什么。

我的问题是,使用 ADO.NET,只保留一个从 Web 服务器到数据库的静态连接,然后在每次查询数据库之前检查此连接服务器端的完整性,这会是一个更明智的选择吗? - 或者,我最好在每次查询之前打开连接,然后再关闭它?

在我看来,第一个选项会更好,因为您可以在每次查询之前节省时间握手等,并且您可以节省数据库和服务器端的内存,因为您只有一个连接,但是这种方法是否有任何缺点? 2 个查询是否会同时发送可能会破坏彼此的完整性或混合返回的数据集?

我已经尝试在这里和网络上到处搜索以找到一些关于此的最佳实践,但没有运气。我得到的最接近的是:is it safe to keep database connections open for long time,但这似乎更适合您拥有多个数据库用户的分布式系统,而我只有我的网络服务器..

【问题讨论】:

    标签: database ado.net web sqlconnection


    【解决方案1】:

    担心性能还为时过早。

    无论如何,连接由框架汇集。您应该尽快打开、使用和处理它们。

    类似...

    public object Load()
    {
      using (SqlConnection cn = new SqlConnection(connectionString))
      using (SqlCommand cm = new SqlCommand(commandString, cn))
      {
        cn.Open();
        return cm.ExecuteScalar();
      }
    }
    

    【讨论】:

      【解决方案2】:

      最好让 ADO.NET 处理连接池。如果它认为需要,它将保持连接,但不要使用静态连接对象。那只是闻起来。最好将连接对象传递给需要它的方法,并在 using 块中创建连接。

      【讨论】:

        【解决方案3】:

        您应该始终在完成数据库交互后关闭您的连接。 ADO.NET 具有连接池,它将负责有效的连接重用。每当您打开第 2 个、第 3 个和后续连接时,它们都会从池中取出,几乎没有开销。

        希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          我会更多地考虑缓存而不是高级连接池。每次获取都需要数据库命中?

          如果它是一个门户,您有共同的内容和用户特定的内容,使用缓存您可以存储共同的项目,以及使用损坏的密钥(使用用户 ID)您可以存储用户特定的项目。

          【讨论】:

          • 缓存将成为我的下一个关注点 .. 在几周内查看 SO xD
          • 我忘了指出缓存是一个更好的选择,而不是弄乱连接对象。 +1。
          【解决方案5】:

          ADO.NET 进行连接池。当您对连接对象调用 close 时,它​​会将连接保留在池中,从而使下一个连接更快。

          【讨论】:

            【解决方案6】:

            你最初的预感是正确的。你需要的是database connection pooling.

            【讨论】:

            • 语言错误。那是关于 EJB (java) 的。
            【解决方案7】:

            您绝对不想为每个数据库调用打开一个连接,这将很快导致性能极差。建立数据库连接非常昂贵。

            您应该使用的是连接池。该池将管理您的连接,并在可能的情况下尝试重用现有连接。

            【讨论】:

            • 这听起来他应该自己做。但是让 ADO.Net 完成他的工作是最好的。
            【解决方案8】:

            我不了解您的平台,但请查看连接池 - 必须有可用的库或实用程序(在基本系统中或作为附加组件,或与数据库驱动程序一起提供)来提供方法将多个活动连接汇集到数据库中,当您从池中获取一个连接时,这些连接已经准备好并准备好使用。

            老实说,我希望池在任何数据库抽象库中默认发生(有一个可用的选项来禁用它)。看来 ADO.NET 就是这样做的。

            【讨论】:

              【解决方案9】:

              真正要问的第一个问题是为什么您非常关心性能?您的预期工作量是多少?你试过了吗?

              但总的来说,是的,拥有一个打开的连接并保持一段时间比每次都重新打开一个数据库连接更聪明;根据连接类型、网络问题和月相,初始连接可能需要一秒钟或更长时间;如果您的工作量是这样的,您期望每 5 秒左右有超过 GET 一次,那么您会更喜欢保持连接。

              【讨论】:

              • 连接池做得更好。如果你要建立一个固定的连接,那将是:每个客户?每个线程?每个应用程序? “我的第一个 asp.net 应用程序”保持一个连接打开并传递它。切换到打开、做事、关闭,节省了数小时的应用时间。
              • 我说了什么不同意?
              • “是的,拥有一个开放的连接并保持一段时间比每次都重新打开一个数据库连接更聪明”——我没有对你投反对票,但这不是最佳实践对于 ADO.NET,这就是问题所在。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-06
              • 1970-01-01
              • 2013-03-15
              相关资源
              最近更新 更多