【发布时间】:2018-03-26 07:47:40
【问题描述】:
我有如下代码:
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 次。
但是一旦打开和关闭连接,这将为每次迭代保留资源并消耗资源。
所以我没有得到处理这个问题的正确方法
有人可以给我一些建议吗?
【问题讨论】:
-
次要问题:在
using (var myConnection之后,您不需要明确地.Dispose()您的连接。由using处理。 -
即使代码只需要 100 毫秒,也始终使用
using语句在Execute方法中打开和关闭连接。Execute-方法是public,你无法控制它的使用。如果您不在Execute中确保连接,则无法保证已处理连接。连接池将确保没有真正的物理连接必须打开/关闭。 -
@TimSchmelter 那么你是说我应该为每次迭代打开和关闭连接,而不是只打开一次连接?
-
@TimSchmelter - 或将 Execute 方法设为私有/内部。
-
这也取决于
Execute的实现。假设它首先对数据库进行查询,该查询在 100 毫秒内完成。然后对从数据库接收到的数据进行繁重的计算,耗时 2 分钟。在这种情况下,这两个选项都是错误的,您应该在Execute中打开连接并在您进行数据库查询后立即关闭它,这样它就不会在 2 分钟的繁重计算执行期间保持打开状态。