【问题标题】:Why is Connection Pooling using excessive memory?为什么连接池使用过多的内存?
【发布时间】: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


【解决方案1】:

您可能遇到了large object heap,导致个别记录未被收集或堆未正确压缩(碎片整理),因此您是应用程序的地址空间(不是物理的内存)变满(大部分都是空洞),您无法再分配新内存。

【讨论】:

  • 如果是这样,为什么 SqlConnection.ClearAllPools 会有帮助?
猜你喜欢
  • 2012-10-26
  • 2010-11-01
  • 1970-01-01
  • 2016-04-26
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多