Tengo un proceso de larga duración. Quiero evitar las fugas de recursos o las conexiones a la base de datos no autorizadas.
A intervalos durante el proceso quiero hacer esto:
- obtener una fábrica de espacios de trabajo de ArcSDE (Oracle)
- abrir un espacio de trabajo desde la fábrica (en ese momento obtengo una conexión de base de datos abierta)
- obtener una clase o tabla de características existente en el área de trabajo,
- consultar la clase o tabla de características, hacer un bucle sobre el cursor haciendo mi negocio
-
entonces libera/cierra todo de manera que :
- La conexión a la base de datos y el bloqueo de la tabla desde la perspectiva de ArcSDE/Oracle (como se revela con algo como "sdemon -o info -I users" o una consulta de la tabla sde.table_locks) se cierra/libera.
- el proceso es resistente a los reinicios de ArcSDE/Oracle (es decir, no estoy dejando algo colgado que no funcionará más tarde después del reinicio nocturno)
- Se liberan las referencias RCW, COM y la memoria.
Básicamente, debido a la larga duración del proceso, Quiero estar realmente seguro de que no tengo fugas de recursos o conexiones deshonestas, y mi proceso puede sobrevivir a los reinicios de ArcSDE/Oracle .
He visto discusiones como:
- ¿Cuáles son las reglas para liberar ArcObjects de la memoria en .NET?
- lo que todo programador de arcobjects debe saber sobre los singletons
- cómo liberar las referencias COM
- interactuar con objetos singleton
Y este De la que cito
Cada fábrica de espacios de trabajo mantiene un conjunto de espacios de trabajo activos y conectados que son referenciados por la aplicación. Cuando se llama a cualquiera de los métodos Open* enumerados anteriormente, la fábrica de espacios de trabajo verifica si se ha abierto previamente un espacio de trabajo con un conjunto de propiedades coincidentes. Si es así, se devuelve una referencia a la instancia existente.
Todo ello me sugiere que debe liberar (por ejemplo, la clase ComReleaser o el bucle equivalente Marshal.ReleaseComObject()), probablemente en este orden:
- cursor
- clase/tabla de características
- espacio de trabajo
- fábrica de espacios de trabajo
Luego hay discusiones como este donde la gente hace todo eso, y tal vez incluso espolvorear en System.GC.Collect() y su conexión de base de datos todavía vive.
Oh, gurús, ¿cuál es la información definitiva sobre esto?
1 votos
¿Has probado algo por ti mismo, o sólo estás pidiendo consejo? La apuesta más segura parece ser la de generar un nuevo hilo o proceso para hacer tu trabajo periódico. Por lo demás, en mi opinión, funcionaría si consigues localizar todos los objetos y liberarlos según tu plan. Si tienes un mapcontrol también podría contener referencias a través de las capas.
0 votos
Estoy en proceso y pido consejo. Si hago la tarea periódica en un hilo de trabajo, ¿debería el trabajador liberar la fábrica del espacio de trabajo, o siendo un singleton, causaría problemas para otros posibles hilos simultáneos? Supongo que debería dejar la fábrica sola?
0 votos
Hay mucho escrito sobre el modelo de roscado de los objetos de arco. Leer edndoc.esri.com/arcobjects/9.2/net/ (9.2 pero sigue siendo válido creo). Dice que los singeltons son singeltons por hilo, no por proceso. También hay que tener en cuenta que los hilos deben ser STA y que no se pueden pasar referencias de objetos de arco entre hilos. Así que si terminas el hilo trabajador debería limpiar las fábricas. También mira en tu propio enlace a ESRI-forum donde el threading es recomendado por ESRI como una solución para liberar las conexiones.