C# 在c中创建新SqlConnection的开销#

C# 在c中创建新SqlConnection的开销#,c#,.net,database,sqlconnection,C#,.net,Database,Sqlconnection,不久前,我为我的.net应用程序编写了一个ORM层,其中所有数据库行都由DatabaseRecord的子类表示。有许多方法,如Load(),Save()等。在我的初始实现中,我在DatabaseRecord的构造函数中创建了一个到数据库的连接 connection = new SqlConnection( ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString ); 然后,在访问数据库的方法的开

不久前,我为我的.net应用程序编写了一个ORM层,其中所有数据库行都由
DatabaseRecord
的子类表示。有许多方法,如
Load()
Save()
等。在我的初始实现中,我在
DatabaseRecord的构造函数中创建了一个到数据库的连接

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();
}
<>我可以理解为什么它是合意的——连接是自动的“代码>处置”(<)/代码> d,即使你在中间所做的事情导致一个未被排除的异常。我只是想知道可能多次这样调用
newsqlconnection()
的开销是多少


连接池已启用,因此我认为开销最小,第二种方法应该是最佳做法,但我只是想确保我的假设是正确的。

是的,这是最佳做法。使用
可以使对Close()异常的调用安全

而且创建(任何)对象的开销确实是最小的,对于短期对象(停留在GC生成0中)也是最小的


请注意,您不再需要在using块结束时调用Close(),它会自动为您完成(Dispose==Close)。

这部分取决于您的喜好。只要使用连接池,创建新连接(回收池连接)的开销将是最小的,因此通常推荐的模式是根据需要创建新的连接对象

如果您在每个命令之后立即运行多个命令,那么我认为没有理由为每个命令创建新连接,但是您应该避免长时间保持打开连接


另外,您应该注意,
Dispose
方法将为您关闭连接。因此,不需要同时调用
Close
Dispose
。由于
using
子句在结束时将调用dispose,因此通常无需调用
Close
如果您不确定打开/关闭连接的成本,请将
SqlConnection
作为类的成员变量,但是要使类
IDisposable
,并在类被释放时释放SqlConnection

感谢所有令人惊讶的快速回答!事实上,仔细想想,我认为这可能是更有效的方法。我在另一个问题中充实了你的建议——如果你能让我知道我是否理解正确,那就太好了:多小?是否有任何基准可以显示打开和关闭连接会损失多少性能?调用Open方法时是否会发生网络握手?实际上,我认为本文完美地回答了我的问题。如果本文是正确的,连接池应该显式地处理握手等,并确保没有不必要的握手继续进行。