C# 在c中创建新SqlConnection的开销#
不久前,我为我的.net应用程序编写了一个ORM层,其中所有数据库行都由C# 在c中创建新SqlConnection的开销#,c#,.net,database,sqlconnection,C#,.net,Database,Sqlconnection,不久前,我为我的.net应用程序编写了一个ORM层,其中所有数据库行都由DatabaseRecord的子类表示。有许多方法,如Load(),Save()等。在我的初始实现中,我在DatabaseRecord的构造函数中创建了一个到数据库的连接 connection = new SqlConnection( ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString ); 然后,在访问数据库的方法的开
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方法时是否会发生网络握手?实际上,我认为本文完美地回答了我的问题。如果本文是正确的,连接池应该显式地处理握手等,并确保没有不必要的握手继续进行。