【发布时间】:2013-04-22 16:41:22
【问题描述】:
我有一种情况,当使用 SqlDataReader 时,我在读取 9k 文本字段时总是收到 System.OutOfMemory 错误。这发生在 MsTest 测试中,并且至少目前一直在发生。
我相当肯定所有 SqlConnections、SqlDataReaders 和 SqlCommands 都包装在 using 块中。执行 reader 时指定 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)
【问题讨论】:
-
有一个特殊的性能计数器 NumberOfReclaimedConnections 可用于查看是否正确释放连接。见msdn.microsoft.com/en-us/library/ms254503.aspx
-
我添加了以下性能计数器:NumberOfActiveConnections、NumberOfFreeConnections、NumberOfInactiveConnectionPools、NumberOfNonPooledConnections、NumberOfPooledConnections、NumberOfReclaimedConnections、NumberOfStasisConnections。唯一在 perfmon 中注册过 0 标记的是“NumberOfInactiveConnectionPools”
标签: .net sql-server-2008 c#-4.0