Eu tenho um processo de longa duração. Quero evitar vazamentos de recursos ou conexões de bancos de dados não autorizados.
Em intervalos durante o processo, eu quero fazer isso:
- obter uma fábrica da área de trabalho do ArcSDE (Oracle)
- abrir um espaço de trabalho da fábrica (nesse momento, recebo uma conexão de banco de dados aberta)
- obtenha uma classe ou tabela de recurso existente na área de trabalho,
- consulta a classe ou tabela de recursos, passa o cursor sobre o cursor fazendo meus negócios
libere / feche tudo de forma que :
- A conexão com o banco de dados e o bloqueio de tabela da perspectiva do ArcSDE / Oracle (como revelado por algo como "sdemon -o info -I users" ou uma consulta da tabela sde.table_locks) são fechados / liberados.
- o processo é resiliente à reinicialização do ArcSDE / Oracle (ou seja, não deixo algo pendente que não funcione mais tarde após o reinício noturno)
- Qualquer RCW, referências COM e memória são liberadas.
Basicamente, devido à natureza de longa duração do processo, quero ter certeza de que não tenho vazamentos de recursos ou conexões não autorizadas, e meu processo pode sobreviver à reinicialização do ArcSDE / Oracle .
Eu já vi discussões como:
- Quais são as regras para liberar o ArcObjects da memória no .NET?
- o que todo programador de arcobjects deve saber sobre singletons
- como liberar referências COM
- interagindo com objetos singleton
E isso , do qual cito
Cada fábrica da área de trabalho mantém um conjunto de áreas de trabalho ativas conectadas no momento e referenciadas pelo aplicativo. Quando qualquer um dos métodos Open * listados anteriormente é chamado, o factory do espaço de trabalho verifica se um espaço de trabalho foi aberto anteriormente com um conjunto de propriedades correspondente. Nesse caso, uma referência à instância existente é retornada.
Tudo o que me sugere que eu deveria liberar (por exemplo, classe ComReleaser ou equivalente Marshal.ReleaseComObject () loop), provavelmente nesta ordem:
- cursor
- featureclass / table
- área de trabalho
- fábrica de espaço de trabalho
Depois, há discussões como esta, onde as pessoas fazem tudo isso, e talvez até polvilhem System.GC.Collect () e sua conexão com o banco de dados ainda existe.
Oh gurus, qual é a droga final definitiva sobre isso?
fonte
Respostas:
Você já abordou muitos aspectos em sua postagem. No entanto, para expandir sua pergunta, sempre siga este padrão:
Em seguida, chame
System.GC.Collect()
para forçar o coletor de lixo a remover quaisquer referências ao DBMS.A ordem da liberação deve ser Cursores, Recursos (IFeature), FeatureClasses, Áreas de Trabalho e outros ArcObjects instanciados.
Os aplicativos ArcGIS Desktop e ArcEngine são STA (aplicativo de thread único). Não é seguro nem recomendado usar o ArcObjects entre threads (Workers); Pode-se usar serialização e desserialização de objetos para conseguir isso. Para mais detalhes, dê uma olhada aqui .
fonte