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

ILo*_*low 4 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
     }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以我没有得到应该处理这个问题的正确方法

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

Cod*_*ler 8

ADO.NET使用了连接池.这就是每次打开新连接不应成为问题的原因.您的呼叫myConnection.Open()实际上不会导致每次都打开与数据库的物理连接.

还检查这个问题.它的作者对连接开放进行了测量测试.我向他展示了接下来要求DbConnection.Open()接近的时间0.

最优选的使用方法DbConnection是在最短的时间内打开它.如果您MyProcess.Execute()的许多其他非DB相关逻辑需要相当长的时间,则在执行期间不应保持打开的连接.

另请参阅使用ADO.NET的最佳实践文章.它有以下明确声明:

高性能应用程序可在最短的时间内保持与正在使用的数据源的连接,并利用连接池等性能增强技术.

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

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

连接池在空闲大约4-8分钟后,或者如果池中检测到与服务器的连接已被切断,则从池中删除连接.请注意,只有在尝试与服务器通信后才能检测到切断的连接.如果找到不再连接到服务器的连接,则将其标记为无效.仅当连接池关闭或回收时,才会从连接池中删除无效连接.

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

  • 正确的。连接池对应用程序透明。即使您关闭或处置(与关闭基本相同)连接,物理连接仍然保留在池中。 (2认同)