2

我有一种情况,在使用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)
4

1 回答 1

1

您可能遇到了大对象堆,这样个别记录要么没有被收集,要么堆没有被正确压缩(碎片整理),这样你的应用程序的地址空间(不是物理内存)就变满了(大部分都是空洞)并且您不再能够分配新内存。

于 2013-04-22T16:44:52.253 回答