2013-04-22 73 views
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) 
+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

回答

1

你可能會擊中large object heap,使得單獨的記錄可能是沒有收集或堆不正確壓實(整理)的相關部分,這樣你的應用程序的地址空間(不是物理內存)變滿(大部分都是空洞),你不能再分配新的內存。

+1

如果是這種情況,爲什麼SqlConnection.ClearAllPools會有幫助? – 2013-04-22 16:49:11

相關問題