2009-08-13 117 views
0

设置:ADO.NET连接池及所涉自动关闭=真

我创建在C#.NET程序WinForms应用程序,让我们的技术支持人员可以轻松地对我们产品的SQL Server 2005数据库执行常见任务。该应用程序使用ADO.NET(SqlConnection)连接到数据库。开发这个应用程序时需要考虑的一个问题是,每次启动一个任务(查询)时,最小化连接/重新连接到数据库的开销。根据我的理解,造成这种开销的主要原因是数据库将AutoClose属性设置为“True”。我很想改变这一点,但不幸的是它不在我的控制之下。我也知道创建数据库连接涉及一些开销,无论如何。我有一个应用程序的工作实现,该应用程序在应用程序的整个生命周期中保持单一连接(除非它曾经以某种方式关闭)。然后我偶然发现了一篇关于connection pooling in ADO.NET的MSDN文章。

阅读了这篇文章后(和其他问题/回答hereherehere)看来,ADO.NET连接池将保持即使我的应用程序已经妥善处理了SqlConnection对象到数据库的连接。该连接将保留在池中,并可重复使用,直至其闲置一段时间或以其他方式中断。因此,我在应用程序中保持单一连接的工作看起来没有必要,而且肯定比每次需要时创建/处理一个SqlConnection更危险。

问题:

  1. 使用ADO.NET连接与“自动关闭”的SQL Server数据库设置为“真”时,池意味着什么存在?

  2. 我意识到当我描述我是如何相信Connection Pooling在幕后工作时,我可能会过于简单化,但除此之外,我的理解是否准确?如果不是,它需要更正哪里?

回答

2

第一个问题,为什么数据库设置为自动关闭?有效场景包括多租户托管和Express实例,但othar比您的数据库不应设置为自动关闭。

连接池将维护在SQL Server 实例上打开的会话。会话将保留对当前的数据库的参考,从而防止其自动关闭。如果您的场景涉及单个应用程序数据库,那么所述数据库不应处于自动关闭状态(不是多租户,数千个数据库,场景)。如果您的场景涉及数千个数据库,那么您的应用程序不应将它们保持打开状态,并且不能将其全部打开。

我认为在你的情况下适当的行动是将数据库设置为自动关闭OFF

+0

我完全同意AutoClose应该被关闭。不幸的是,我对这个决定没有控制力或影响力。 – dcharles 2009-08-13 23:09:22

+0

我会做什么,而不是依靠合并浮点行为(即当连接退出时,* current *数据库是什么),我会在应用中保持打开一个非常明确的连接,仅用于此目的。也就是说,无论谁拥有“影响力和控制力”,都可能会注意到有人正在保持其亲爱的数据库的开放性,并且随身携带叉子和手电筒。 – 2009-08-13 23:27:08

+0

感谢您的帮助! – dcharles 2009-08-15 07:12:06