我有一種情況,當使用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)
有一個特殊的性能計數器NumberOfReclaimedConnections,您可以使用它來查看是否正確釋放連接。請參閱http://msdn.microsoft.com/en-us/library/ms254503.aspx – 2013-04-22 16:47:48
我添加了以下性能計數器:NumberOfActiveConnections,NumberOfFreeConnections,NumberOfInactiveConnectionPools,NumberOfNonPooledConnections,NumberOfPooledConnections,NumberOfReclaimedConnections,NumberOfStasisConnections。在0標記之上的perfmon中註冊的唯一一個是「NumberOfInactiveConnectionPools」 – Nathan 2013-04-22 17:23:25