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

时间:2013-04-22 16:41:22

标签: .net sql-server-2008 c#-4.0

我有一种情况,当使用SqlDataReader时,我在读取9k文本字段时始终收到System.OutOfMemory错误。这是在MsTest测试中发生的,至少在目前,一直在发生。

我相当确定所有SqlConnections,SqlDataReaders和SqlCommands都包含在using块中。执行阅读器时指定System.Data.CommandBehavior.SequentialAccess无效。

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

为什么连接池会占用过多内存?

编辑:这是stacktrace的相关部分

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)

1 个答案:

答案 0 :(得分:1)

您可能正在点击large object heap,因此未收集单个记录或未正确压缩堆(进行碎片整理),这样您就是应用程序的地址空间( <物理内存)变满(大多数是空洞),你不再能够分配新的内存。