多次打开和关闭SQL连接有多糟糕?有什么确切的效果?

时间:2009-09-10 09:26:00

标签: sql-server sqlconnection fill sqldataadapter sqlperformance

例如,我需要使用SQLDataAdapter的Fill()方法填充大量DataTable:

DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
....
....

即使所有dataadapter对象都使用相同的SQLConnection,每个Fill方法都会打开和关闭连接,除非在方法调用之前连接状态已经打开。

我想知道的是,如何不必要地打开和关闭SQLConnections会影响应用程序的性能。需要扩展多少才能看到此问题的不良影响(100,000个并发用户?)。在一个中型网站(每天50000个用户)中,是否值得打扰和搜索所有Fill()调用,将它们保存在代码中并在任何Fill()调用之前打开连接并在之后关闭?

3 个答案:

答案 0 :(得分:9)

ADO.NET具有连接池,例如当你关闭一个连接时,它并没有真正完全关闭,但如果你要求一个具有完全相同的连接字符串的新连接,那就“回收”。

尽管如此 - 如果你已经提前知道,你必须逐个调用这五种填充方法,我肯定会推荐

  • 打开连接
  • 从数据库中读取所有五个数据表
  • 立即再次关闭连接

以这种方式做到这是最好的做法,它不会伤害你 - 所以就这样做吧! :-)

马克

PS:ADO.NET中的连接池当然只有在你没有关闭的情况下才有效! :-)默认情况下启用 - 您必须明确禁用它。

答案 1 :(得分:1)

关键点:

  • 为什么要打开,保留和重用连接?

    <强>性能

您可能希望打开和关闭连接的原因有很多。您必须决定 使用的最佳权衡取舍。您可以同时执行以下操作:在一段时间内使用开放连接和/或设置一定数量的交易,然后关闭它并打开一个新交易。

与数据库中的其他简单任务相比,打开和关闭SQL连接昂贵。但是,如果您的实际任务已经非常耗时,可能不会注意到额外的开销(如果您已经隐藏了实际任务的等待时间 - 那么用户就不会开始随机点击事物 - 比如重试)。

测试用例:

您可以通过编写两个版本的测试查询来衡量您的差异。选择任何简单的SQL任务(每个版本中需要相同)。

在版本一个中,使用单个常量打开连接循环外部循环,通过简单任务循环X次。

中,通过打开和关闭内部循环来执行此操作。

更改X次以匹配您的使用情况和期望值。这应该会让您真正感受到对 系统的影响。

希望能帮助你理解基础......杰克。

答案 2 :(得分:0)

NECRO答案: 最好的方法是将连接放在&#39;使用&#39;声明,以便它确定它需要做的工作:

using (SqlConnection conn = new SqlConnection())
{
    DataAdapter1.Fill(DataTable1);
    DataAdapter2.Fill(DataTable2);
    DataAdapter3.Fill(DataTable3);
    DataAdapter4.Fill(DataTable4);
    DataAdapter5.Fill(DataTable5);
    ...
    ...
}