我正在分析在執行SQL選擇時發生在我們的應用程序中的OutOfMemoryException。OutOfMemoryException與SQL選擇
環境:
- 86 .NET應用程序4.6.1(沒有可能把它作爲64位)
- Devart.Data 5.0.1491.0
- Devart.Data.Oracle 9.1.67.0
- Entity Framework 6.0.0.0
- Oracle 12c
會發生什麼情況?
訪問包含大量數據的多個表的特定查詢會引發此異常。這隻發生在使用了一段時間的應用程序之後,首先它工作正常。一旦發生異常,該查詢總是失敗;其他人工作。
異常來源於:
拋出異常類型'System.OutOfMemoryException'。 堆棧跟蹤:
at Devart.Data.Oracle.OracleDataReader.a()
at Devart.Data.Oracle.OracleDataReader.Read()
[...]
在做:
context.Database.SqlQuery<T>(query, allParameters.ToArray()).ToList()
背景:是System.Data.Entity.DbContext
查詢:是對SQL查詢(字符串)我們計算自己
參數:包含1個參數,指定要反彈的最大結果數量
分析:
使用dotMemory分析應用程序時,查詢的工作時間與不查詢的時間差別不大。
工作:總共507MB,.NET使用76MB
不工作:535MB,.NET使用的104MB
我們離.NET可用的2GB空間很遠。
當用「的Oracle SQL Developer」查詢總是成功的在〜30年代
執行相同的查詢當使用DbMonitor我們可以看到〜查詢和回退之間25秒的延遲(由於異常完成) 。查詢和回滾都有錯誤'成功完成'。
是否有人知道這個問題的原因或可能的解決辦法? DevArt可能會錯誤地拋出此異常,因爲它例如達到暫停?是否有一個內部緩存從.NET進程中分離出來,並在一段時間後被填充?
我第一次在DevArt論壇上發佈了這個問題,但沒有得到答案。
在此先感謝您的幫助。
你檢查堆碎片嗎? https://www.jetbrains.com/help/dotmemory/2016.3/Heap_Fragmentation.html – Chris