在.NET中管理数据库连接的最佳实践是什么?

Rob*_*Rob 10 .net database-connection connection-pooling

关于在.NET应用程序中管理数据库连接的最佳实践 - 我知道,通常,传递连接对象是不好的.

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


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

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

  • 保持两个私有静态连接打开,每个对象一个,在处理对象之前不要关闭.

  • 不要保持静态连接; 打开并随后关闭每个需要它的方法的新连接.但是,我的大多数方法只运行1-3个查询,所以这看起来效率低......


我的第二个问题基本上是相同的,但对于一个单一的形式.这里最好的是什么?

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

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

Kie*_*one 12

(是评论)......

理论上,您不应该从业务逻辑中访问数据库 - 它应该位于单独的数据访问类中.(例如,将来你需要将它们以XML格式离线存储,或者使用Oracle而不是SQL Server ......你不想重写你的业务逻辑!)

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

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

您可以通过使用连接池来缓解您的低效率恐惧,这意味着如果您打开和关闭连接数百次,则他们可能都会使用相同的连接.但是你根本不应该保持数据库连接 - 尤其不是作为类的成员.

希望有所帮助!


cha*_*chu 8

我的理解是,只要需要,连接应该保持开放.大多数时候我在使用语句中看到了连接,类似于

using (DBConnection db = new DBConnection(connectString))
{
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • @Rob:连接池的关键是真正的连接不会一直打开和关闭."打开"只会从池中获得现有的开放连接. (5认同)

Joh*_*ant 7

此链接可能会有所帮助:使用ADO.NET的最佳实践

这是一个有趣的摘录.

为获得最佳性能,请仅在需要时保持与数据库的连接.此外,减少打开和关闭多个操作的连接的次数.

我一直遵循在使用块中打开连接的做法,因此总是调用Dispose方法(因此也就是Close方法)而不用担心它.使用这种方法,我从来没有遇到过这样的情况:性能不佳与过多的并发连接或过度的设置或拆除操作有关.


Tho*_*mas 6

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