多次打开和关闭 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 地址并返回完全限定域名的脚本 [关闭]
在 Postgresql 中打开和关闭连接的最佳时机是啥时候?