【问题标题】:What are best practices on managing database connections in .NET?在 .NET 中管理数据库连接的最佳实践是什么?
【发布时间】:2011-03-16 14:03:47
【问题描述】:

关于在 .NET 应用程序中管理数据库连接的最佳实践——我知道,一般来说,传递连接对象是不好的。

但是,我有一些特殊的好奇心:


1.我有两个业务实例 不同类别的对象,在一个 亲子关系(孩子 是私人的。)以下哪项 最好?

  • 保持一个私有静态连接打开和共享,供两个对象使用,并保持打开状态,直到父对象被释放。

  • 保持两个私有静态连接打开,每个对象一个,而不是 关闭,直到对象被处置。

  • 不要保持静态连接;打开然后关闭一个新的 连接每个需要它的方法。但是,我的大多数方法只运行 1-3 个查询,所以这似乎效率低下...?


2。我的第二个问题本质上是相同的,但针对的是单一形式。这里有什么最好的?

  • 在表单的生命周期内保持一个私有静态连接打开和共享。

  • 不要保持静态连接;为需要它的表单中的每个方法打开并随后关闭连接(同样,每个方法只需 1-3 个查询。)

【问题讨论】:

  • 这是 winform 还是 ASP.Net 应用程序?
  • 理论上你不应该从你的业务逻辑中访问数据库——它应该在一个单独的数据访问类中。 (例如,将来您需要将它们离线存储在 XML 中,或者使用 Oracle 而不是 SQL Server……您不想重新编写业务逻辑!)。现在要回答了..
  • @Rob:我认为您应该阅读我认为重复的问题。问题不同,但那里的答案实际上回答了你的问题。如果您认为这不能回答它,我敢打赌,其他 239 个具有相同标签的问题之一会回答它。
  • 不敢相信有多少人建议保留连接对象并保持活动状态.. 这是不对的!
  • @Kieren Johnstone:同意。 @Rob:我认为您真的应该考虑为什么您的业务对象对数据库连接一无所知。

标签: .net database-connection connection-pooling


【解决方案1】:

(是评论)...

理论上你不应该从你的业务逻辑中访问数据库——它应该在一个单独的数据访问类中。 (比如说将来你需要将它们离线存储在 XML 中,或者使用 Oracle 而不是 SQL Server……你不想重写你的业务逻辑!)

您的业务对象不应有与之关联的数据库连接。应该以某种 DAL 工厂类型的方法打开连接,检索/构建对象,然后关闭连接并返回对象。

业务对象本身应包含业务逻辑字段和方法,它们可能会回调数据访问层,数据访问层应为每个 DAL 方法创建一个新的数据库连接。

使用连接池可以消除您对效率低下的担忧,这意味着如果您打开和关闭一个连接数百次,它们很可能都会使用同一个连接。但是你根本不应该让数据库连接一直悬而未决——尤其是作为一个类的成员。

希望有帮助!

【讨论】:

    【解决方案2】:

    此链接可能会有所帮助:Best Practices for Using ADO.NET

    这是一段有趣的摘录。

    为了获得最佳性能,请保持连接 仅当数据库打开时 必需的。另外,减少数量 打开和关闭连接的次数 用于多个操作。

    我一直遵循在 using 块中打开连接的做法,因此始终调用 Dispose 方法(以及因此的 Close 方法)而不用担心它。使用这种方法,我从未遇到过性能不佳与过多的并发连接或过多的设置或拆卸操作相关的情况。

    【讨论】:

      【解决方案3】:

      在回答这两个问题时,如果您使用的是具有连接池的东西,例如 ADO.NET,您应该编写查询代码以使连接保持打开状态尽可能短。 IE。 open and subsequently close a new connection for every method that requires it.。当您关闭连接时,它将返回到连接池并在后续查询中重用,因此您不会因打开和关闭一堆连接而导致性能损失。优点是您不会冒忘记关闭的连接泄漏的风险,从长远来看,与长时间保持连接打开相比,同时打开的连接会更少。应用程序是 Windows 窗体还是 Web 窗体无关紧要:保持连接尽可能短。

      【讨论】:

        【解决方案4】:

        我的理解是,连接应该只在需要时保持打开状态。大多数时候我在 Using 语句中看到了连接,类似于

        using (DBConnection db = new DBConnection(connectString))
        {
            //do stuff
        }
        

        【讨论】:

        • 这也是我的理解。但是,当我的一半方法所做的工作非常少时,我担心不断打开/关闭连接的开销,我想知道为表单保留单个连接是否会更有效。
        • @Rob:连接池的重点是真正的连接不会一直打开和关闭。 “打开”只会从池中获取现有的开放连接。
        猜你喜欢
        • 2018-08-23
        • 2016-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 2011-07-25
        • 1970-01-01
        • 2015-07-20
        相关资源
        最近更新 更多