在循环中打开和关闭连接的正确方法

时间:2018-03-26 07:47:40

标签: c# ado.net

我有一个如下代码:

public void Do
{
      using (var myConnection = new SqlConnection(connectionString))
      {
           for (int i = 0; i < 4; i++)
           {
               MyProcess.Execute(myConnection);

           }
           myConnection.Close();
           myConnection.dispose();
      }
}
public class MyProcess
{
     public void Execute(SqlConnection myConnection)
     {
          if (myConnection.State == ConnectionState.Closed)
                myConnection.Open();
          //long running code
     }
}

Execute methods有时需要5-10分钟,有时每次迭代运行1-2分钟。

现在我很困惑,我是否会为每次迭代打开和关闭连接,这将是有效的,或者我是否只打开和关闭连接一次。

但是一旦打开和关闭连接,这将为每次迭代保留资源并消耗资源。

所以我没有得到应该处理这个

的正确方法

有人可以就此给我一些建议吗?

1 个答案:

答案 0 :(得分:8)

ADO.NET底层使用Connection Pooling。这就是每次打开新连接不应成为问题的原因。您对myConnection.Open()的调用实际上不会导致每次都打开与数据库的物理连接。

同时检查this question。它的作者对连接开放进行了测量测试。我已经向他展示了随后拨打DbConnection.Open()来接近0的时间。

使用DbConnection的最佳方式是在最短的时间内打开它。如果您的MyProcess.Execute()有很多其他非DB相关逻辑需要相当长的时间,那么在执行期间不应该保持打开的连接。

另请查看Best Practices for Using ADO.NET文章。它有以下明确声明:

  

高性能应用程序保持与数据源的连接   使用最少的时间,以及利用   性能增强技术,如连接池。

  

那么Ado.net什么时候从连接池中删除连接?

This article提供了有关连接池的一些内部详细信息:

  

连接池在拥有后从池中删除连接   闲置了大约4-8分钟,或者如果小便者检测到了   与服务器的连接已被切断。注意切断了   只有在尝试与之通信后才能检测到连接   服务器。如果找到不再连接的连接   服务器,它被标记为无效。删除了无效的连接   仅在连接池关闭或回收时才从连接池中获取。

本文还提供了有关池调整的一些详细信息(如果需要)。但是,只有在遇到由池引起的性能问题时才应考虑此类手动配置。