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

Posted

技术标签:

【中文标题】多次打开和关闭 SQL 连接有多糟糕?确切的效果是啥?【英文标题】:How bad is opening and closing a SQL connection for several times? What is the exact effect?多次打开和关闭 SQL 连接有多糟糕?确切的效果是什么? 【发布时间】:2009-09-10 09:25:59 【问题描述】:

例如,我需要使用 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() 调用之前打开连接并在之后关闭?

【问题讨论】:

【参考方案1】:

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

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

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

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

马克

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

【讨论】:

【参考方案2】:

关键点:

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

性能

您可能希望打开和关闭连接的原因有很多。您必须决定使用的最佳折衷方案。您可以同时执行以下操作:在一段时间内和/或一定数量的事务中使用一个打开的连接,然后关闭它并打开一个新的。

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

测试用例:

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

在版本 one 中,使用单个恒定打开连接在循环之外,循环通过您的简单任务 X 次。

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

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

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

【讨论】:

【参考方案3】:

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

using (SqlConnection conn = new SqlConnection())

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

【讨论】:

以上是关于多次打开和关闭 SQL 连接有多糟糕?确切的效果是啥?的主要内容,如果未能解决你的问题,请参考以下文章

我的 Perl 有多糟糕?获取 IP 地址并返回完全限定域名的脚本 [关闭]

我应该何时打开和关闭与 SQL Server 的连接

在 Postgresql 中打开和关闭连接的最佳时机是啥时候?

何时打开和关闭MS Access SQL中的连接括号

如何在 C# .NET 中保持 TCP 连接打开并执行多次写入/读取?

“using”关键字不会关闭打开的 SQL 连接