2017-03-13 98 views
1

我正在分析在執行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論壇上發佈了這個問題,但沒有得到答案。

在此先感謝您的幫助。

+0

你檢查堆碎片嗎? https://www.jetbrains.com/help/dotmemory/2016.3/Heap_Fragmentation.html – Chris

回答

1

如建議here作爲第一個選項,請嘗試將OracleCommandFetchSize屬性明確設置爲合理值(如100)。

我已經找到了在此之前的文章,但我一直沒能設置 FetchSize(即使是現在調查2小時後)。我們沒有例示我們自己的 OracleCommand;它正在執行 查詢時完成。

使用connection string到指定的值,並用很低一個開始,以確定是否是這樣的原因。

+0

我以前發現過這篇文章,但是我還沒有能夠設置FetchSize(即使在調查了2小時後)。我們沒有自己實例化'OracleCommand';它正在執行查詢時完成。我期望在https://www.devart.com/dotconnect/oracle/docs/EFProviderConfiguration.html中找到默認屬性,但沒有。你知道如何配置它嗎? – Philippe

+0

你不能在[連接字符串](https://www.connectionstrings.com/oracle-provider-for-ole-db-oraoledb/controling-the-fetchsize/)中指定它嗎? –

+0

你是對的連接字符串,非常感謝!首先測試表明,將值增加到1000可以解決問題(目前我還沒有能夠重現該問題);將其降至50仍會引發異常(默認值爲100)。我現在必須進一步調查以瞭解其影響(乍看之下,爲什麼增加讀取大小會減少已用內存)和配置文件以查看執行時間如何受到影響。 – Philippe