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:
- Holen Sie sich eine ArcSDE (Oracle) Workspace Factory
- Öffnen Sie ab Werk einen Arbeitsbereich (an diesem Punkt erhalte ich eine offene Datenbankverbindung).
- eine vorhandene Feature-Class oder Tabelle im Arbeitsbereich abrufen,
- Fragen Sie die Feature-Class oder Tabelle ab und durchlaufen Sie den Cursor, der mein Geschäft erledigt
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:
- Welche Regeln gelten für die Freigabe von ArcObjects aus dem Speicher in .NET?
- Was jeder Arcobjects-Programmierer über Singletons wissen sollte
- wie man COM-Referenzen freigibt
- Interaktion mit Singleton-Objekten
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?
quelle
Antworten:
Sie haben in Ihrem Beitrag bereits viele Aspekte behandelt. Um Ihre Frage zu erweitern, folgen Sie jedoch immer diesem Muster:
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 .
quelle