为什么连接池使用过多的内存?

问题描述:

我有一种情况,当使用SqlDataReader时,我一直在读取9k文本字段时出现System.OutOfMemory错误。这在MsTest测试中发生,并且至少目前一直在发生。为什么连接池使用过多的内存?

我相当肯定所有的SqlConnections,SqlDataReaders和SqlCommands都包装在using块中。在执行阅读器时指定System.Data.CommandBehavior.SequentialAccess不起作用。

但是,如果在测试的麻烦部分打开连接之前拨打SqlConnection.ClearAllPools(),问题就会消失。

连接池为什么会持有过多的内存?

编辑:这里是堆栈跟踪

at System.Data.SqlClient.TdsParser.TryReadPlpUnicodeChars(Char[]& buff, Int32 offst, Int32 len, TdsParserStateObject stateObj, Int32& totalCharsRead) 
at System.Data.SqlClient.TdsParser.TryReadSqlStringValue(SqlBuffer value, Byte type, Int32 length, Encoding encoding, Boolean isPlp, TdsParserStateObject stateObj) 
at System.Data.SqlClient.TdsParser.TryReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj) 
at System.Data.SqlClient.SqlDataReader.TryReadColumnInternal(Int32 i, Boolean readHeaderOnly) 
at System.Data.SqlClient.SqlDataReader.TryReadColumn(Int32 i, Boolean setTimeout, Boolean allowPartiallyReadColumn) 
at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i) 
at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i) 
at System.Data.SqlClient.SqlDataReader.get_Item(Int32 i) 
+0

有一个特殊的性能计数器NumberOfReclaimedConnections,您可以使用它来查看是否正确释放连接。请参阅http://msdn.microsoft.com/en-us/library/ms254503.aspx – 2013-04-22 16:47:48

+0

我添加了以下性能计数器:NumberOfActiveConnections,NumberOfFreeConnections,NumberOfInactiveConnectionPools,NumberOfNonPooledConnections,NumberOfPooledConnections,NumberOfReclaimedConnections,NumberOfStasisConnections。在0标记之上的perfmon中注册的唯一一个是“NumberOfInactiveConnectionPools” – Nathan 2013-04-22 17:23:25

你可能会击中large object heap,使得单独的记录可能是没有收集或堆不正确压实(整理)的相关部分,这样你的应用程序的地址空间(不是物理内存)变满(大部分都是空洞),你不能再分配新的内存。

+1

如果是这种情况,为什么SqlConnection.ClearAllPools会有帮助? – 2013-04-22 16:49:11