释放连接或关闭连接。

8
以下两种方法哪一种性能更好?
using( var DB_Connection_s = new DBConnection() )
{
 //todo: interact with database connection
}

或者只是:
DB_Connection_s.Close();

第一种方法是否使连接池的概念变得无用?因为如果每次使用后都要释放连接,那么每次都必须打开一个新连接(连接池中就不会有任何连接了)。

at the end.


1
我知道,但我想问的是每次都杀掉连接是否有性能上的好处,以及使用对象池的好处是什么?! - Anyname Donotcare
因为我知道当我只关闭连接时,它仍然留在池中,如果它没有活动,则会被使用。 - Anyname Donotcare
4
您可能希望更正那个打字错误... - Oded
关闭连接池连接,无论是使用“using”还是直接关闭,都会将其返回到连接池中。 - Oded
1
常识告诉我,Dispose() 会关闭、清理和释放更多资源,而 Close() 则允许您更快地重新打开?但是我可能是错的。 - FrankRuperto
显示剩余2条评论
4个回答

7
使用using模式更好,因为Dispose调用会关闭连接,但作为奖励,即使在using中出现异常或返回导致程序执行退出using范围的情况下,连接也会关闭。使用using,您不需要显式关闭连接,这使得代码更易读。
另一个模式是尽早关闭连接。频繁地打开/关闭连接没有性能损失,因为连接池会为您优化连接重用。

这是否意味着,如果我释放了连接,它仍然会留在池中呢? - Anyname Donotcare
1
@just_name,是的,关闭和释放都没有区别:关闭的连接只是被释放到池中。 - Felice Pollano
并且已释放的连接也会返回到连接池中,我说得对吗? - Anyname Donotcare
1
@just_name 是的,你是对的,dispose 只是调用 close,而 close 只是释放到池中。 - Felice Pollano

5

当您在连接上调用Close或Dispose时,连接将被释放回池中...

来源 = SQL Server Connection Pooling (ADO.NET)

因此,不必担心错过了池化连接而导致性能损失。
从代码角度来看,差异应该是非常小的,因此应始终使用using语句。


嗯,这是否意味着如果我处理连接,它将保留在池中。那么Close()和Dispose()之间的主要区别是什么?如果它们都将连接返回到池中。 - Anyname Donotcare
这篇关于MSDN的文章讨论了这两种方法之间的区别。请阅读BinaryCoder的答案。 - Steve

1

如果您不打算很快再次调用.Open(),请使用using(){}块。

如果您很快会在其他地方使用相同的连接,请先调用.close();,然后再调用.open()等等...同时保持类实现IDisposable并在那里处理连接的释放!

仍需要时间来创建Connection对象。


1

使用Dispose方法。在Dispose方法内部,它会关闭连接,因此您不需要担心。如果有疑问,可以使用Reflector或类似工具轻松检查。

至于性能,我仍然建议使用Using语句。Windows启用了各种缓存(特别是在ODBC中),以确保可以重复使用对同一连接的请求,因此您不应该太担心性能问题。


我知道,但我想问的是每次都杀掉连接是否有性能上的好处,以及使用面向对象编程的好处是什么?! - Anyname Donotcare
抱歉 - 我的错,正在更新我的答案。 - Ian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接