ODP.NETのロードデータを空間データベースに使用する場合、UDTを使用してSDOGEOMETRYタイプを定義しています。UDTを使用するとODP.NETのメモリリークが発生する:
次に、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 =新しいオブジェクト[numRowsToInsert];私はは、ExecuteNonQuery(でプログラムを実行してみました
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
..
)除去し、その後、まったくMemoryLeakageはありません....
編集: また、UDTパラメータを削除して、プログラムを実行しようとしましたが、漏れはありません。だから、問題はUDTに非常に密接に関連しているようです:sとwhen文が実行されます。
私は11.2.0.2.1
誰でも任意の手掛かりを得たODP.NETを使用していますか? ExecuteNonQuery()を実行していない場合に作成されない、きれいにする必要があるものはありますか?
ExecuteNonQueryメソッドは、(ODP.NETプロバイダを介して)すべてのADO.NETの作業を実行するので、実行しないとリークは発生しません。さまざまなADO.NETオブジェクト(接続とコマンド)を適切にオープン、クローズ、ディスポーザルしていますか? –
私はコードを挿入して実行していますが、UDT列を残しておくと(他の17列を残しても)メモリがリークしません... コマンドは次のようにクリーンアップされています:cmd.Connection.PurgeStatementCache cmd.ArrayBindCount = 0; (int i = 0; i
Peter
あなたは正しいことをしているように思えます。次のステップは、[WinDbg](http://blogs.msdn.com/b/johan/archive/2007/11/13/getting-started-with-windbg-part-i)を使用して.NETのメモリリークを検証することです。 .aspx)。残念ながらセットアップ&使用するにはかなり難しいツールです。メモリがリークしたときにアプリケーションのメモリダンプを作成します。 WinDbgでロードして.NET用に設定した後、!dumpheap -type "UDT columnn type"ここでは、UDT columnnタイプに実際のODP.NETタイプを使用します。多くのインスタンスがポップアップすると、ガベージコレクションのルートチェーンに入っている可能性が高くなります。 –