J'ai un processus de longue haleine. Je souhaite éviter les fuites de ressources ou les connexions de base de données malveillantes.
À des intervalles au cours du processus, je veux faire ceci:
- obtenir une fabrique d'espace de travail ArcSDE (Oracle)
- ouvrir un espace de travail de l'usine (auquel point j'obtiens une connexion de base de données ouverte)
- obtenir une classe d'entités ou une table existante sur l'espace de travail,
- interroger la classe d'entités ou la table, faire une boucle sur le curseur pour faire mes affaires
puis relâchez / fermez tout ce qui :
- La connexion à la base de données et le verrouillage de table du point de vue d'ArcSDE / Oracle (comme révélé par quelque chose comme "sdemon -o info -I users" ou une requête de la table sde.table_locks) est fermé / libéré.
- le processus résiste aux redémarrages d'ArcSDE / Oracle (c'est-à-dire que je ne laisse pas quelque chose en suspens qui ne fonctionnera pas plus tard après le redémarrage nocturne)
- Toutes les références RCW, COM et mémoire sont libérées.
Fondamentalement, en raison de la nature longue du processus, je veux être vraiment sûr de ne pas avoir de fuites de ressources ou de connexions malveillantes, et mon processus peut survivre au redémarrage d'ArcSDE / Oracle .
J'ai vu des discussions telles que:
- Quelles sont les règles de libération d'ArcObjects de la mémoire dans .NET?
- ce que tout programmeur d'arcobjects devrait savoir sur les singletons
- comment libérer des références COM
- interagir avec des objets singleton
Et cela , dont je cite
Chaque fabrique d'espace de travail gère un pool d'espaces de travail actifs actuellement connectés qui sont référencés par l'application. Lorsqu'une des méthodes Open * répertoriées précédemment est appelée, la fabrique d'espace de travail vérifie si un espace de travail a déjà été ouvert avec un ensemble de propriétés correspondant. Si tel est le cas, une référence à l'instance existante est renvoyée.
Tout cela me porte à croire que je devrais sortir (par exemple classe ComReleaser ou boucle Marshal.ReleaseComObject () équivalent), probablement dans cet ordre:
- le curseur
- classe / table
- espace de travail
- usine d'espace de travail
Ensuite, il y a des discussions comme celle-ci où les gens font tout cela, et peut-être même saupoudrer dans System.GC.Collect () et leur connexion à la base de données est toujours en vie.
Oh gourous, quelle est la dernière drogue droite à ce sujet?
la source
Réponses:
Vous avez déjà couvert de nombreux aspects dans votre message. Cependant, pour développer votre question, suivez toujours ce modèle:
Appelez ensuite
System.GC.Collect()
pour forcer le garbage collector à supprimer toutes les références au SGBD.L'ordre de publication doit être les curseurs, les fonctionnalités (IFeature), les FeatureClasses, les espaces de travail et autres ArcObjects instanciés.
ArcGIS Desktop et l'application ArcEngine sont STA (application à thread unique). Il n'est ni sûr ni conseillé d'utiliser ArcObjects sur des threads (Workers); On peut utiliser la sérialisation et la désérialisation des objets pour y parvenir. Pour plus de détails, jetez un œil ici .
la source