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 に答える