关于在.NET应用程序中管理数据库连接的最佳实践 - 我知道,通常,传递连接对象是不好的 .
但是,我有一些特定的好奇心:
1. I have two instances of business objects, of different classes, in a parent-child relationship (the child is private.) Which of the following is best?
-
保持一个私有静态连接打开并共享,由两个对象使用,并保持打开状态,直到处理完父节点 .
-
保持两个私有静态连接打开,每个对象一个,在处理对象之前不要关闭 .
-
不要保持静态连接;打开并随后为每个需要它的方法关闭一个新连接 . 但是,我的大多数方法只运行1-3个查询,所以这看起来效率低......
2. My second question is essentially the same, but for a single form. What's best here?
-
保持一个私有静态连接打开并共享表单的生命周期 .
-
不要保持静态连接;打开并随后为需要它的表单中的每个方法关闭一个连接(同样,每个方法只有1-3个查询 . )
4 回答
我的理解是,只要需要,连接应该保持开放 . 大多数时候我在使用语句中看到了连接,类似于
此链接可能会有所帮助:Best Practices for Using ADO.NET
这是一个有趣的摘录 .
我一直遵循在使用块中打开连接的做法,因此总是调用Dispose方法(因此也就是Close方法)而不用担心它 . 使用这种方法,我从来没有遇到过这样的情况:性能不佳与过多的并发连接或过度的设置或拆除操作有关 .
(是评论)......
理论上,您不应该从业务逻辑中访问数据库 - 它应该位于单独的数据访问类中 . (例如,将来你需要将它们以XML格式离线存储,或者使用Oracle而不是SQL Server ......你不想重写你的业务逻辑!)
您的业务对象不应具有与之关联的数据库连接 . 应该在一些DAL工厂类型方法中打开连接,检索/构建对象,然后关闭连接并返回对象 .
业务对象本身应包含业务逻辑字段和方法,这些字段和方法可以回调数据访问层,数据访问层应为每个DAL方法创建新的数据库连接 .
您可以通过使用连接池来缓解您的低效率恐惧,这意味着如果您打开和关闭连接数百次,则很可能它们都将使用相同的连接 . 但是你根本不应该保持数据库连接 - 尤其不是作为类的成员 .
希望有所帮助!
在回答这两个问题时,如果您使用的是具有连接池的内容,例如ADO.NET,则应编写查询代码以尽可能缩短连接 . 即
open and subsequently close a new connection for every method that requires it.
. 当您关闭连接时,它将返回到连接池并在后续查询中重用,因此您不会因打开和关闭一堆连接而导致性能下降 . 优点是,与长时间保持连接打开相比,您打开的同时连接数更少 . 应用程序是Windows窗体而不是Web窗体并不重要:保持连接尽可能短 .