C#Windows应用程序 - 许多线程使用相同的连接?

时间:2008-12-23 18:17:39

标签: c# database multithreading ado.net

我有一个多线程的c#WINDOWS应用程序。我的理解是,在Web环境中,连接会自动汇集。我的理解是,在Windows应用程序中,情况并非如此。因此,对于Windows应用程序,应使用相同的连接,而不是在每次调用后关闭,而是在应用程序关闭时关闭。

我很好奇 - 我是对的吗?如果是,两个线程是否可以使用相同的连接同时从数据库获取数据集,或者该功能是否排队?

由于

3 个答案:

答案 0 :(得分:5)

连接池是ADO.NET的一个功能。因此,连接已经合并。不仅仅是在网络环境中。

http://www.ondotnet.com/pub/a/dotnet/2004/02/09/connpool.html

答案 1 :(得分:2)

  

我的理解是在网络上   环境,连接汇集   自动。这也是我的   了解在Windows应用程序中,   事实并非如此。

不,这是错的,正如m3rLinEz指出的那样。连接总是汇集在一起​​。

  

因此,对于Windows应用程序,同样如此   应该使用连接而不是   每次通话后关闭,但相反   应用程序关闭时关闭。

可以在单片WinForms应用程序中保持连接打开一段时间。但最好在需要时使用打开/关闭连接的标准模式。连接池意味着您不会注意到性能差异。并且您的数据访问代码将与ASP.NET等服务器应用程序兼容。

  

如果是,则两个线程可以使用相同的线程   从中获取数据集的连接   DB同时或是那个   排队的功能?

没有。 ADO.NET类(连接,命令等)不是线程安全的,不应在没有同步的线程之间共享。但如上所述,您应该更喜欢数据访问的标准模式。

答案 2 :(得分:0)

好吧 - 所以我的这个假设是通过观察引起的:当我尝试以典型的游泳池方式设置win应用程序时,我总是遇到3-5秒的延迟,同时建立了与远程服务器的真实连接。即使我做了一个打开,然后关闭,下一个查询总是有这个延迟。

当服务器连接时,它显然不会为池中的每个连接建立连接。此外,池化机制是否足够智能以获取它知道已经打开的连接,或者它是否可以简单地抓取任何随机连接?

池中的默认最大连接数是什么?