DPB*_*DPB 2 .net ado.net memory-leaks sqlconnection
我知道你需要调用.Close()一个SqlConnection对象,以便在完成后将基础SQL连接释放回池中; 但如果你不这样做,即使超出范围,.NET对象是否仍然留在内存中?我问,因为我正在处理一些遇到内存泄漏的代码,我注意到SqlConnection对象没有被关闭或处理(它们被创建,打开,然后只是被允许超出范围).
问题不是内存泄漏.问题是与SQL服务器的连接仍然是打开的,这意味着连接不适用于需要与该服务器通信的其他内容.
如果连接超出范围并被垃圾收集和处理,最终将关闭连接,但是不知道何时会发生这种情况.您的应用程序在给定时间只能打开这么多SQL连接,而SQL服务器本身只能支持这么多连接.
可以把它想象成一个负责任的人从图书馆借书.如果你没有归还这本书,它最终会回到图书馆,因为有一天你会死,当有人清理你的房子时,他们会找到这本书然后把它寄回图书馆.但如果每个人都这样做,那么在图书馆找书籍真的很难.因此,在我们准备好阅读之前,我们不会查看这本书,我们会在完成后立即将其归还.
SQL连接也是如此.在您需要它们之前不要打开它们,并在完成它们后尽快关闭它们.并且,如其他答案所示,using通过确保连接将被处理(也将其关闭)而不必使用来简化它try/finally.