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

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

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

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

有帮助吗?

解决方案

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

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

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

这样做是公认的最佳做法,它不会伤害您 - 所以就这样做吧!:-)

马克

附:当然,ADO.NET 中的连接池仅在您未将其关闭时才起作用!:-) 默认情况下它是打开的 - 您必须明确禁用它。

其他提示

关键点:

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

    表现

您可能想要打开和关闭连接的原因有很多。您必须决定最佳权衡在哪里 你的 使用。您可以同时执行以下两项操作:使用打开的连接一段时间和/或一定数量的事务,然后关闭它并打开一个新连接。

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

测试用例:

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

版本中 , ,使用单个常量打开连接来完成此操作 外部 循环,循环执行您的简单任务 X 次。

在里面 第二, ,通过连接的打开和关闭来完成 里面 循环。

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

希望能帮助您了解基础知识...杰克。

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

using (SqlConnection conn = new SqlConnection())
{
    DataAdapter1.Fill(DataTable1);
    DataAdapter2.Fill(DataTable2);
    DataAdapter3.Fill(DataTable3);
    DataAdapter4.Fill(DataTable4);
    DataAdapter5.Fill(DataTable5);
    ...
    ...
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top