當使用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()不會創建?
ExecuteNonQuery方法執行所有ADO.NET工作(通過ODP.NET提供程序),因此不執行會導致泄漏。你是否正確地打開,關閉和處理各種ADO.NET對象(連接和命令)? – 2012-03-21 17:26:20
我相信如此,運行代碼WITH插入但忽略UDT列(但保留其他17列)不會泄漏內存... 命令被清理爲: cmd.Connection.PurgeStatementCache(); cmd.ArrayBindCount = 0; (int i = 0; i
Peter
2012-03-22 06:55:35
聽起來像你正在做正確的事情。下一步是使用[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