2012-03-21 72 views
1

當使用ODP.NET加載數據到空間數據庫時,我使用UDT來定義SDOGEOMETRY類型。使用UDT時ODP.NET內存泄漏:s

然後我使用OracleCommand上的ArrayBindCount來加載批量的數據。一切正常,但我看到的進程的內存不斷增加,和性能計數器顯示了同樣的事情..使用創建

參數:

var param = new OracleParameter("geom", OracleDbType.Object); 
param.UdtTypeName = "MDSYS.SDO_GEOMETRY"; 
param.Direction = ParameterDirection.Input; 
cmd.Parameters.Add(param); 

而且,我設置了cmd.AddToStatementCache = FALSE以防止數據在那裏結束..

添加我使用的數據時: param.Value = new object [numRowsToInsert];

int row = 0; 
foreach (var row in rowstoinsert) 
{ 
    OracleUDT.SdoGeometry geoVal = rowstoinsert[row].geom; 
    (param.Value as object[])[row] = geoval; 
} 

...

cmd.ExecuteNonQuery(); //THIS IS WHERE MEMORY LEAK APPEARS TO BE 

..

我試着用的ExecuteNonQuery()去掉,然後就沒有MemoryLeakage在所有運行的程序....

編輯: 我也嘗試刪除UDT參數,並通過該程序運行,也沒有任何泄漏。所以看起來問題與UDT:s和執行語句時非常接近。

我正在使用ODP.NET 11.2.0.2.1

任何人有任何線索? 是否有我需要清理,如果不運行ExecuteNonQuery()不會創建?

+0

ExecuteNonQuery方法執行所有ADO.NET工作(通過ODP.NET提供程序),因此不執行會導致泄漏。你是否正確地打開,關閉和處理各種ADO.NET對象(連接和命令)? – 2012-03-21 17:26:20

+0

我相信如此,運行代碼WITH插入但忽略UDT列(但保留其他17列)不會泄漏內存... 命令被清理爲: cmd.Connection.PurgeStatementCache(); cmd.ArrayBindCount = 0; (int i = 0; i Peter 2012-03-22 06:55:35

+0

聽起來像你正在做正確的事情。下一步是使用[WinDbg]驗證.NET中的內存泄漏(http://blogs.msdn.com/b/johan/archive/2007/11/13/getting-started-with-windbg-part-i的.aspx)。不幸的是,這是一個非常令人畏懼的工具來設置和使用。當應用程序泄漏內存時創建應用程序的內存轉儲。在WinDbg中加載併爲.NET配置後,運行!dumpheap -type「UDT columnn type」,其中您將實際的ODP.NET類型用於UDT columnn類型。如果有很多實例彈出,那麼很可能它們位於垃圾收集根鏈中。 – 2012-03-22 12:55:10

回答

0

想到我會對此進行跟進。 經過多次電子郵件與Oracle技術支持我終於得到這個接受作爲一個錯誤

這似乎是錯誤10157396已修復12.1,計劃在11.2.0.4固定,並已回溯到11.2.0.2 (在Patch Bundle 18中可用)。這可以從MyOracleSupport作爲補丁10098816(11.2.0.2)和13897456(Bundle 18)下載,以獲得臨時解決方案,同時我們獲取到11.2.0.3的回送端或直到11.2.0.4發佈。