例如,我需要使用SQLDataAdapter的Fill()方法填充大量DataTable:
DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
....
....
即使所有dataadapter对象都使用相同的SQLConnection,每个Fill方法都会打开和关闭连接,除非在方法调用之前连接状态已经打开。
我想知道的是,如何不必要地打开和关闭SQLConnections会影响应用程序的性能。需要扩展多少才能看到此问题的不良影响(100,000个并发用户?)。在一个中型网站(每天50000个用户)中,是否值得打扰和搜索所有Fill()调用,将它们保存在代码中并在任何Fill()调用之前打开连接并在之后关闭?
答案 0 :(得分:9)
ADO.NET具有连接池,例如当你关闭一个连接时,它并没有真正完全关闭,但如果你要求一个具有完全相同的连接字符串的新连接,那就“回收”。
尽管如此 - 如果你已经提前知道,你必须逐个调用这五种填充方法,我肯定会推荐
以这种方式做到这是最好的做法,它不会伤害你 - 所以就这样做吧! :-)
马克
PS:ADO.NET中的连接池当然只有在你没有关闭的情况下才有效! :-)默认情况下启用 - 您必须明确禁用它。
答案 1 :(得分:1)
关键点:
为什么要打开,保留和重用连接?
<强>性能强>
您可能希望打开和关闭连接的原因有很多。您必须决定 使用的最佳权衡取舍。您可以同时执行以下操作:在一段时间内使用开放连接和/或设置一定数量的交易,然后关闭它并打开一个新交易。
与数据库中的其他简单任务相比,打开和关闭SQL连接昂贵。但是,如果您的实际任务已经非常耗时,可能不会注意到额外的开销(如果您已经隐藏了实际任务的等待时间 - 那么用户就不会开始随机点击事物 - 比如重试)。
测试用例:
您可以通过编写两个版本的测试查询来衡量您的差异。选择任何简单的SQL任务(每个版本中需要相同)。
在版本一个中,使用单个常量打开连接在循环外部循环,通过简单任务循环X次。
在秒中,通过打开和关闭内部循环来执行此操作。
更改X次以匹配您的使用情况和期望值。这应该会让您真正感受到对 系统的影响。
希望能帮助你理解基础......杰克。
答案 2 :(得分:0)
NECRO答案: 最好的方法是将连接放在&#39;使用&#39;声明,以便它确定它需要做的工作:
using (SqlConnection conn = new SqlConnection())
{
DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
...
...
}