首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在循环中打开和关闭连接的适当方法

在循环中打开和关闭连接的适当方法
EN

Stack Overflow用户
提问于 2018-03-26 07:47:40
回答 1查看 2.1K关注 0票数 5

我有一个代码如下:

代码语言:javascript
运行
复制
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分钟。

在这里,我搞不懂是为每一次迭代打开和关闭连接,还是只打开和关闭连接一次,这是有效的。

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

所以我没有得到正确的方法来处理这件事

有人能给我一些建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-26 07:51:57

ADO.NET在引擎盖下使用连接池。这就是为什么每次打开一个新的连接不应该是一个问题。您对myConnection.Open()的调用实际上不会导致每次打开到数据库的物理连接。

也检查一下这个问题。作者对连接口进行了测量测试。我已经向他展示了随后调用DbConnection.Open()方法到0的时间。

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

也可以查看使用ADO.NET的最佳实践文章。它有以下明确声明:

高性能应用程序将与数据源的连接保持在最少的时间内,并利用性能增强技术(如连接池)。那么Ado.net什么时候从连接池中删除连接呢?

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

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

本文还提供了一些关于必要时池调优的详细信息。但是,只有当您遇到由池引起的一些性能问题时,才应该考虑这种手动配置。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49486402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档