Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于打开/关闭多个数据库连接的最佳实践_C#_Database_Performance_Web Applications - Fatal编程技术网

C# 关于打开/关闭多个数据库连接的最佳实践

C# 关于打开/关闭多个数据库连接的最佳实践,c#,database,performance,web-applications,C#,Database,Performance,Web Applications,我在一个web应用程序中有一个方法,其中包含大量代码。在几乎相反的方法中,我有数据库交互 最佳做法是多次打开/关闭其连接,还是在第一次需要时打开/关闭其连接 多次 先开后关 如果你有两匹马,你想知道哪匹马是最好的 跑得比你的马快。不要写简短的描述 马,把它们发布在互联网上,让随机的陌生人猜一猜 哪个更快!即使你只是碰巧得到了一个准确的答案, 你对它的准确性有什么信心?你可以轻松地 通过同时运行这两个程序,准确地发现两个程序中哪一个更快 你自己用秒表测量 始终在处理完连接后立即关闭连接,以便它们

我在一个web应用程序中有一个方法,其中包含大量代码。在几乎相反的方法中,我有数据库交互

最佳做法是多次打开/关闭其连接,还是在第一次需要时打开/关闭其连接

多次

先开后关

如果你有两匹马,你想知道哪匹马是最好的 跑得比你的马快。不要写简短的描述 马,把它们发布在互联网上,让随机的陌生人猜一猜 哪个更快!即使你只是碰巧得到了一个准确的答案, 你对它的准确性有什么信心?你可以轻松地 通过同时运行这两个程序,准确地发现两个程序中哪一个更快 你自己用秒表测量


始终在处理完连接后立即关闭连接,以便它们可以返回到池中,并可供其他调用方使用。连接池得到了很好的优化,因此这样做没有明显的惩罚。该建议基本上与事务相同-在完成时保持简短和关闭。

实现这一点的理想方法是在初始连接中获取所有数据。但是,如果您有一个包含非常耗时的代码的大型方法,那么在方法调用的整个过程中保持连接打开是非常昂贵的

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


在我年轻的时候,我通过艰苦的方式学会了这一点,并使一堆服务器崩溃。非常确定您仍然使用池连接(不确定是否必须手动设置)

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

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

    ..all of your code

  }
}

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

如果您知道不久后将需要连接,为什么要关闭连接?因此,问题是……您问我们什么更快,我问您为什么要关闭连接。“我有两个垃圾袋要处理。我应该在倾倒这两个垃圾袋之间合上垃圾桶的盖子吗?”。这取决于其间发生了什么,取决于你做了什么。总的来说,答案是:当你期望很快再次使用它时,保持它的打开状态。也许我在寻找“最佳实践”。根据你的评论,“最佳实践”是在我需要的时候保持连接打开,在我不再需要时关闭连接。我认为这是一个有趣的问题。下面的MikeC建议“按方法”重新连接。这种方法在文献中非常常见,我可以看出这是无状态软件的一个要求。另一方面,我不确定在GUI会话的生命周期中保持开放连接有多大的罪恶。对于您的具体案例1,连接是足够的。“更有效的方式”[原始研究][需要引文]引文-Apress PRO asp.net还建议,这意味着您应该尽可能快地将其打开足够长的时间,以获取所需的数据。如果您有N个查询,那么您可以将其打开足够长的时间,以获得N个查询。如果以后在应用程序中需要获取更多数据,请打开另一个连接,冲洗并重复。理想的方法是在初始连接中获取所有数据。但是,如果您有一个包含非常耗时的代码的大型方法,则在方法调用的整个过程中保持连接打开是非常昂贵的。@Steve我完全同意您最后的评论,这就是我一直试图说的。:-)也许“性能”不是最好的词。“最佳实践”是我想要的。我不同意关于马的部分。有时候最好问问有经验的人。已经知道哪匹马在各种情况下跑得更快的人。在那个例子中,一匹马在长距离上可能比另一匹马跑得快,另一匹马在短距离上可能比另一匹马跑得快,一匹马在雨中可能跑得快,另一匹马在天气好的时候跑得快。很难测试所有的条件。由于没有正确地进行测试而导致的问题很难衡量。客户机上使用的内存,服务器上消耗的内存,一些测量数据库连接吞吐量的方法,客户机和服务器上的空闲时间,当然还有执行时间,然后出现连接限制问题等等。总之,这里发生的事情远不止“哪一个执行的时间更短”,实际上“赛马”是非常困难的。
connection.Open();
//execute db interaction

//execute business logic

//etc...

//execute db interaction
connection.Close();
public void MyMethod(){
  using(SqlConnection conn = new SqlConnection()){

    ..all of your code

  }
}