多次打开和关闭 SQL 连接有多糟糕?具体效果如何?
-
05-07-2019 - |
题
例如,我需要使用 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);
...
...
}