4

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

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

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

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

4

3 回答 3

10

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

尽管如此 - 如果您已经提前知道您将不得不一一调用这五个 Fill 方法,我绝对会推荐

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

这样做是公认的最佳实践,它不会伤害你——所以就这样做吧!:-)

马克

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

于 2009-09-10T10:08:02.023 回答
1

关键:

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

    表现

您可能想要打开和关闭连接的原因有很多。您必须决定最适合您使用的权衡取舍。你可以同时做:在一段时间和/或一定数量的事务中使用一个打开的连接,然后关闭它并打开一个新的。

与数据库中的其他简单任务相比,打开和关闭 SQL 连接的成本很高。但是,如果您的实际任务已经很耗时,则可能不会注意到额外的开销(如果您已经隐藏了实际任务的等待期——因此用户不会开始随机点击事物——比如重试)。

测试用例:

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

在版本一中,使用循环的单个恒定开放连接来执行此操作,循环通过您的简单任务 X 次。

第二个中,通过打开和关闭循环内的连接来完成。

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

希望这可以帮助您了解基础知识……杰克。

于 2010-06-02T23:35:45.517 回答
1

NECRO 回答:最好的方法是将连接放在“使用”语句中,以便将其范围限定为它需要做的工作:

using (SqlConnection conn = new SqlConnection())
{
    DataAdapter1.Fill(DataTable1);
    DataAdapter2.Fill(DataTable2);
    DataAdapter3.Fill(DataTable3);
    DataAdapter4.Fill(DataTable4);
    DataAdapter5.Fill(DataTable5);
    ...
    ...
}
于 2017-10-05T19:43:20.520 回答