ADO.NET连接池和AutoClose = True的含义

时间:2009-08-13 22:52:14

标签: c# .net sql-server ado.net connection-pooling

设定:

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

阅读完文章(以及其他问题/答案hereherehere)后,即使我的ADO.NET连接池仍将保持与数据库的连接应用程序已正确处理其SqlConnection对象。连接将保留在池中,并且可以重复使用,直到它空闲一段时间或者被破坏为止。因此,我在应用程序中维护单个连接的工作似乎是不必要的,而且肯定比每次需要时创建/处置SqlConnection更危险。

问题:

  1. 将“AutoClose”设置为“true”的SQL Server数据库使用ADO.NET连接池时会出现什么影响?

  2. 当我描述我如何相信连接池在幕后工作时,我意识到我可能过于简单了但除此之外,我的理解是否准确?如果没有,它需要在哪里纠正?

1 个答案:

答案 0 :(得分:2)

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

连接池将维护在SQL Server 实例上打开的会话。会话将在当前数据库上保留引用,从而阻止其自动关闭。如果您的方案涉及单个应用程序数据库,则所述数据库不应该处于自动关闭状态(不是多租户,数千个数据库,方案)。如果你的场景涉及数千个数据库,那么你的应用程序不应该让它们保持打开状态,除此之外它不能让它们全部打开。

我认为您的案例中的正确操作是将数据库设置为自动关闭关闭