繁体   English   中英

在c#中创建新SqlConnection的开销

[英]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方法将为您关闭连接。 因此无需同时调用CloseDispose 由于using子句在结束时会调用dispose,因此通常不需要调用Close

如果您不确定打开/关闭连接的成本,请让SqlConnection成为您的类的成员变量,但是在类被处置时使类IDisposable并处理SqlConnection

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM