.net 中 sqlconnection 的 dispose()、close() 区别
转自:https://www.cnblogs.com/lykbk/p/fghbrt54645645645.html
IDispose 接口可以通过 Using 关键字实现使用后立刻销毁,因此,Dispose 适合只在方法中调用一次 SqlConnection 对象,而 Close 更适合 SqlConnection 在关闭后可能需要再次打开的情况。
Close() 方法回滚任何挂起的事务。然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接,应用程序可以多次调用 Close。不会生成任何异常。如果将连接池值 Pooling 设置为 true 或 yes,则也会释放物理连接。
Dispose() 方法实际是和 Close() 做的同一件事,唯一的区别是 Dispose 方法清空了 ConnectionString,即设置为了 null。
using 表示在 {} 区间后,自动调用 Dispose 方法,保证对象被销毁。 using 只能用在集成了 IDispose 接口的类上
引用微软ADO.Team的经理的话说,sqlconnection 的 close 和 dispose 实际是做的同一件事,唯一的区别是 Dispose 方法清空了 ConnectionString,即设置为了 null.
SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=northwind;User ID=sa;Password=steveg"); con.Open(); con.Close(); con.Open(); con.Dispose(); con.Open();
如果 dispose 后给 connectionString 重新赋值,则不会报错。
由此得出的结论是不管是 dispose 还是 close 都不会销毁对象,即不会释放内存,它们会把 sqlconnection 对象丢到连接池中,那此对象什么时候销毁呢?我觉得应该是 connection timeout 设置的时间内,如果程序中没有向连接池发出请求说要 connection 对象,sqlconnection 对象便会销毁,这也是连接池存在的意义。
刚开始以为 dispose 会释放资源清空内存,如果这样的话,连接池不是每次都是要创建新对象,那何来重用 connection 呢?在网上看到很多人说 close 比 dispose 好,我想真正的原因是 dispose 后的 sqlconnection 对象要重新初始化连接字符串而已,并不是象某些人说的 dispose 会释放对象。
所以在 try..catch 和 using 的选择上大胆的使用 using 吧,真正的效率差异我想可能只有百万分之一秒吧(连接池重用该连接对象初始化连接字符串的时间),而且 enterprise library 中封装的 data access 层全是用的 using,从代码的美观和效率上综合考虑,using 好
补充:using 不会捕捉其代码快中的异常,只会最后执行 dispose 方法,相当于 finally{dispose},本文主要是想说明 dispose 和 close 的差异,因为 using 是绝对 dispose 的,可是如果人为的写 try..finally 有的人会选择 close 有的人会选择 dispose,实际上在这二者的选择上是有差异的,dispose 方法会执行 close 方法
输了你,赢了世界又如何...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署