【问题标题】:Best practice regarding opening/closing multiple database connections关于打开/关闭多个数据库连接的最佳实践
【发布时间】:2013-02-14 19:54:46
【问题描述】:

我在 web-application 中有一个方法,其中包含大量代码。在该方法的几乎相反的两端,我有数据库交互。

多次打开/关闭连接还是在第一次需要时打开/在最后一次需要时关闭连接最佳实践吗?

多次

connection.Open();
//execute db interaction
connection.Close();

//execute business logic

connection.Open();
//execute db interaction
connection.Close();

//execute business logic

connection.Open();
//execute db interaction
connection.Close();

//etc...

先打开/最后关闭

connection.Open();
//execute db interaction

//execute business logic

//etc...

//execute db interaction
connection.Close();

【问题讨论】:

  • 如果您知道不久之后您将需要它,您为什么要想要关闭连接?
  • 因此,问题...
  • 您在问我们什么更快,我在问您为什么还要关闭它。 “我有两个垃圾袋要丢弃。在倾倒这两个垃圾袋之间是否应该关闭罐盖?”。这取决于中间发生了什么,取决于做了什么。一般来说,答案是:在您希望很快再次使用它时保持打开状态。
  • “性能”在这里并不是最好的词。也许我正在寻找“最佳实践”。对于您的 cmets,“最佳做法”是在我需要时保持连接打开,并在我不再需要时关闭它。
  • 我认为这是一个有趣的问题。下面的 MikeC 推荐了一个新的连接“每个方法”。这种方法在文献中很常见,我可以看到这是无状态软件的要求。另一方面,我不确定在一个 GUI 会话的生命周期内保持一个开放的连接有多大的罪过。对于您的特定情况,1 连接就足够了。

标签: c# database performance web-applications


【解决方案1】:

解决此问题的理想方法是在初始连接中获取所有数据。但是,如果您有一个包含非常耗时的代码的大型方法,则在方法调用的整个过程中保持连接打开的成本很高。

因此,打开和关闭两次(对于数据库)效率更高。数据库背后的理念是您希望尽快打开和关闭它们,这样您就不会占用其他用户也使用的资源。

当我年轻的时候,我很难学会这一点,并且崩溃了一堆服务器。可以肯定的是,无论如何您都使用池连接(不确定是否必须手动设置)

【讨论】:

  • “效率更高” [原创研究] [需要引用]
  • 引用 - Apress PRO asp.net 也建议这样做
  • 尽可能快意味着您应该将其保持打开状态的时间足以获取您需要的数据。如果您有 N 个查询,请将其保持打开足够长的时间以获取 N 个查询。如果稍后在应用程序中您需要获取更多数据,则打开另一个连接并冲洗并重复
  • 解决此问题的理想方法是在初始连接中获取所有数据。但是,如果您有一个大型方法的代码非常耗时,那么在方法调用的整个过程中保持连接打开的成本很高。
  • @Steve 我完全同意你的最后评论,这就是我一直想说的。 :-)
【解决方案2】:

每种方法我使用一个连接:

public void MyMethod(){
  using(SqlConnection conn = new SqlConnection()){

    ..all of your code

  }
}

知识渊博的人可能会提供更好的答案。

【讨论】:

    【解决方案3】:

    http://ericlippert.com/2012/12/17/performance-rant/

    如果您有两匹马,并且您想知道这两匹马中的哪一匹是 快然后比赛你的马。不要写简短的描述 马,将它们发布到互联网上,并让随机的陌生人猜测 哪个更快!就算你得到了准确的答案, 你怎么相信它的准确性?您可以轻松且 通过运行两个程序来准确发现两个程序中哪个更快 自己用秒表测量它们。

    在完成连接后始终关闭连接,这样它们底层的数据库连接就可以返回到池中并可供其他调用者使用。连接池经过了很好的优化,因此没有明显的惩罚。该建议与交易基本相同 - 完成后保持简短并关闭。

    【讨论】:

    • 也许“性能”不是最好的词。 “最佳实践”是我的目标。
    • 我不同意关于马的部分。有时最好问问有经验的人。已经知道在各种条件下哪匹马更快的人。在那个例子中 - 一匹马在长距离上可能比其他马快,在短距离上另一匹马更快,一匹在雨中可以跑得更快,另一匹在天气好的时候。很难测试所有条件。
    • 由于没有正确执行此操作而导致的问题很难衡量。你有客户端机器上使用的内存,服务器上消耗的内存,一些测量数据库连接吞吐量的方法,空闲时间,在客户端和服务器上,你当然有执行时间,然后那里是达到连接限制等问题。总而言之,这里发生的不仅仅是“执行哪个需要更少的时间”,实际上“赛马”会非常困难.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2013-02-16
    • 1970-01-01
    相关资源
    最近更新 更多