新的.NET 通用语句运行库的一个大的(真正相当大的)不同之处在于它的垃圾内存回收功能。它好象是在上一次纽约市垃圾回收工人所使用的技术上建立起来的。它并不是把对象除去并设置成Nothing,这些无用的对象(比方ADO.NET Connection对象)仅仅是被遗弃在街道上(内存)中腐烂掉。
只有在回收器没有更多的空地(内存)可以用的时候,它才会进行查找,统计出最不常使用的对象然后把它们装进回收袋里。这意味着如果你让一个Connection对象(即一个SqlConnection,OleDbConnection或者OdbcConnection)超出它们的范围存在而不进行关闭的话,这个连接会保持打开的状态并存放在缓冲区里直到“春天”来临。ADO.NET并不保证关闭这些连接。如果你有很多空闲的RAM,这个问题并不会很糟糕,因为CLR垃圾回收程序不会觉得需要进行垃圾回收直到所有可用的内存都已经满了。
这意味着当Connection不再使用的时候,在你打开的Connections上使用Close方法是非常关键的。如果你使用的是一个DataReader对象,你可以要求它自动为你关闭连接,但是除非你关闭DataReader本身的话,这个连接并不会被关闭。如果你不想让你的程序在办公室里变得臭名招著的话,我建议你在打扫自己的垃圾的时候要求更严格一些。