ArcObjects .NET - Schließen / Freigeben von FeatureClass, Workspace, Factory

8

Ich habe einen langjährigen Prozess. Ich möchte Ressourcenlecks oder unerwünschte Datenbankverbindungen verhindern.

In Abständen während des Prozesses möchte ich dies tun:

  1. Holen Sie sich eine ArcSDE (Oracle) Workspace Factory
  2. Öffnen Sie ab Werk einen Arbeitsbereich (an diesem Punkt erhalte ich eine offene Datenbankverbindung).
  3. eine vorhandene Feature-Class oder Tabelle im Arbeitsbereich abrufen,
  4. Fragen Sie die Feature-Class oder Tabelle ab und durchlaufen Sie den Cursor, der mein Geschäft erledigt
  5. dann alles freigeben / schließen, so dass :

    • Die Datenbankverbindung und Tabellensperre aus Sicht von ArcSDE / Oracle (wie durch "sdemon -o info -I Benutzer" oder eine Abfrage der Tabelle sde.table_locks offenbart) wird geschlossen / freigegeben.
    • Der Prozess ist für ArcSDE / Oracle-Neustarts unempfindlich (das heißt, ich lasse nichts hängen, das später nach dem nächtlichen Neustart nicht funktioniert.)
    • Alle RCW-, COM-Referenzen und Speicher werden freigegeben.

Grundsätzlich möchte ich aufgrund der Langlebigkeit des Prozesses wirklich sicher sein, dass ich keine Ressourcenlecks oder unerwünschten Verbindungen habe und mein Prozess ArcSDE / Oracle-Neustarts überstehen kann .

Ich habe Diskussionen gesehen wie:

Und das , aus dem ich zitiere

Jede Arbeitsbereichsfactory verwaltet einen Pool von derzeit verbundenen aktiven Arbeitsbereichen, auf die die Anwendung verweist. Wenn eine der zuvor aufgelisteten Open * -Methoden aufgerufen wird, überprüft die Arbeitsbereichsfactory, ob zuvor ein Arbeitsbereich mit einem passenden Satz von Eigenschaften geöffnet wurde. In diesem Fall wird ein Verweis auf die vorhandene Instanz zurückgegeben.

All das mir zeigt , dass ich sollte (zB ComReleaser Klasse oder gleichwertig Marshal.ReleaseComObject () Schleife), wahrscheinlich in dieser Reihenfolge Mitteilung:

  • Mauszeiger
  • Feature-Class / Tabelle
  • Arbeitsplatz
  • Arbeitsbereich Fabrik

Dann gibt es Diskussionen wie diese, in denen die Leute all das tun und vielleicht sogar System.GC.Collect () einstreuen und ihre Datenbankverbindung noch besteht.

Oh Gurus, was ist der letzte Straight Dope dazu?

MC5
quelle
1
Haben Sie selbst etwas versucht oder fragen Sie nur um Rat? Die sicherste Wette scheint einen neuen Thread oder Prozess zu erzeugen, um Ihre regelmäßige Arbeit zu erledigen. Andernfalls würde es meiner Meinung nach funktionieren, wenn Sie es schaffen, alle Objekte aufzuspüren und sie gemäß Ihrem Plan freizugeben. Wenn Sie eine Kartensteuerung haben, enthält diese möglicherweise auch Verweise auf die Ebenen.
Stefan
Ich bin in Bearbeitung und bitte um Rat. Hier ist eine Folgefrage zu Ihrem Kommentar: Wenn ich die periodische Aufgabe für einen Worker-Thread ausführe, sollte der Worker die Workspace-Factory freigeben, oder wenn es sich um einen Singleton handelt, führt dies zu Problemen für andere mögliche gleichzeitige Threads? Ich denke, ich sollte die Fabrik in Ruhe lassen?
MC5
Über das Threading-Modell für Bogenobjekte ist viel geschrieben. Lesen Sie edndoc.esri.com/arcobjects/9.2/net/… (9.2, aber ich denke, es ist immer noch gültig). Es heißt, die Singeltons sind Singeltons pro Thread, nicht pro Prozess. Beachten Sie außerdem, dass Threads STA sein sollten und dass Sie keine Bogenobjektreferenzen zwischen Threads übergeben können. Wenn Sie also den Arbeitsthread beenden, sollten die Fabriken bereinigt werden. Schauen Sie auch in Ihrem eigenen Link zum ESRI-Forum nach, wo ESRI Threading als Lösung zum Freigeben von Verbindungen empfiehlt.
Stefan

Antworten:

4

Sie haben in Ihrem Beitrag bereits viele Aspekte behandelt. Um Ihre Frage zu erweitern, folgen Sie jedoch immer diesem Muster:

if (obj!=null)
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(obj);

obj = null;

Rufen Sie dann System.GC.Collect()auf, um den Garbage Collector zu zwingen, alle Verweise auf das DBMS zu entfernen.

Die Reihenfolge der Freigabe muss Cursor, Features (IFeature), FeatureClasses, Workspaces und andere instanziierte ArcObjects sein.

ArcGIS Desktop und ArcEngine sind STA (Single Threaded Application). Es ist weder sicher noch ratsam, ArcObjects über Threads (Worker) hinweg zu verwenden. Man kann Serialisierung und Deserialisierung von Objekten verwenden, um dies zu erreichen. Weitere Details finden Sie hier .

Farid Cheraghi
quelle