長期にわたるプロセスがあります。リソースリークや不正なデータベース接続を防止したい。
プロセス中の間隔でこれを実行したい:
- ArcSDE(Oracle)ワークスペースファクトリを取得する
- 工場からワークスペースを開きます(この時点でデータベース接続が開かれます)
- ワークスペースに既存のフィーチャクラスまたはテーブルを取得し、
- フィーチャクラスまたはテーブルをクエリし、カーソルをループしてビジネスを行います
次に、次のようなものをすべて解放/閉じます。
- ArcSDE / Oracleの観点からのデータベース接続とテーブルロック(「sdemon -o info -I users」またはsde.table_locksテーブルのクエリなどによって明らかになる)は、クローズ/解放されます。
- プロセスは、ArcSDE / Oracleの再起動に対して回復力があります(つまり、毎晩の再起動後に後で機能しない何かがハングしたままになることはありません)。
- RCW、COM参照、およびメモリが解放されます。
基本的に、プロセスは長時間実行されるため、リソースリークや不正な接続が発生していないことを確認し、プロセスがArcSDE / Oracleの再起動に耐えられるようにします。
私は次のような議論を見てきました:
- .NETのメモリからArcObjectsを解放するためのルールは何ですか?
- すべてのarcobjectsプログラマがシングルトンについて知っておくべきこと
- COM参照を解放する方法
- シングルトンオブジェクトとの対話
そしてこの、からIの引用
各ワークスペースファクトリは、アプリケーションによって参照される、現在接続されているアクティブなワークスペースのプールを維持します。上記のOpen *メソッドのいずれかが呼び出されると、ワークスペースファクトリは、一致するプロパティセットでワークスペースが以前に開かれているかどうかを確認します。その場合、既存のインスタンスへの参照が返されます。
これらすべてから、おそらくこの順序で、リリースする必要があることがわかります(たとえば、ComReleaserクラスまたは同等のMarshal.ReleaseComObject()ループ)。
- カーソル
- フィーチャクラス/テーブル
- ワークスペース
- ワークスペース工場
次に、このような議論が行われ、人々はそれをすべて行います。おそらくSystem.GC.Collect()に振りかけても、データベース接続はまだ存続しています。
おお、教祖、これの最後のストレートドープは何ですか?