【问题标题】:ADO.NET Connection Pooling and implications for AutoClose = TrueADO.NET 连接池和 AutoClose = True 的含义
【发布时间】:2009-08-13 22:52:13
【问题描述】:

设置:

我正在用 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 连接池与“AutoClose”设置为“true”的 SQL Server 数据库一起使用时会产生什么影响?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    我认为在您的情况下正确的操作是将数据库设置为自动关闭 OFF

    【讨论】:

    • 我完全同意应该关闭自动关闭。不幸的是,我无法控制或影响该决定。
    • 我会做什么,而不是依赖于池化未注释的行为(即当连接退出池时,current 数据库是什么),我会保持打开状态应用程序中非常明确的连接,仅用于此目的。话虽如此,谁拥有“影响力和控制权”,它可能会注意到有人在保持其亲爱的数据库开放,并用叉子和火炬来追赶你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2017-06-14
    • 2015-02-26
    相关资源
    最近更新 更多