[英]Overhead of creating new SqlConnection in c#
前段时间我为.net应用程序编写了一个ORM层,其中所有数据库行都由DatabaseRecord
的子类表示。 有许多方法,如Load()
, Save()
等。在我的初始实现中,我在DatabaseRecord
的构造函数中创建了与DB的连接,例如
connection = new SqlConnection(
ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString
);
然后我在访问数据库的方法的开头和结尾处调用该SqlConnection上的Open()
和Close()
。 这对我来说(作为熟悉编程但对c#和.net不熟悉的人)是最有效的做事方式 - 有一个连接并在课堂上必要时打开/关闭它。
我刚刚做了一些阅读,似乎在许多地方推荐这种模式:
using (var connection = new SqlConnection(...)) {
connection.Open();
// Stuff with the connection
connection.Close();
}
我可以看到为什么它是可取的 - 连接是自动Dispose()
d,即使你在中间做的东西导致未捕获的异常。 我只是想知道调用new SqlConnection()
的开销可能是这样的很多次。
连接池已启用,因此我认为开销很小,第二种方法应该是最佳实践,但我只是想确保我的假设是正确的。
是的,这是最好的做法。 using
会使您对Close()的调用异常安全。
创建(任何)对象的开销确实是最小的,对于短期对象(保留在GC生成0中)最小。
请注意,您不必再在using-block的末尾调用Close(),它会自动为您完成(Dispose == Close)。
这部分是品味问题。 只要您使用连接池,创建新的(回收池化连接)的开销将是最小的,因此通常建议的模式是根据需要创建新的连接对象。
如果你紧接着运行几个命令,那么我认为没有理由为每个命令创建新的连接,但你应该避免长时间保持打开连接。
此外,您应该注意Dispose
方法将为您关闭连接。 因此无需同时调用Close
和Dispose
。 由于using
子句在结束时会调用dispose,因此通常不需要调用Close
。
如果您不确定打开/关闭连接的成本,请让SqlConnection
成为您的类的成员变量,但是在类被处置时使类IDisposable
并处理SqlConnection
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.