¿Cómo liberar el bloqueo en un gdb?

11

Tengo problemas para liberar mi gdb en ArcGIS10. Mi herramienta funciona con un gdb local, pero no pude liberarlo después del proceso. En Ag9.3 puedo liberarlo simplemente por Marshal.ReleaseComObject (espacio de trabajo), pero esto no funciona en AG10. Además, liberar todos los cursores de función no ayuda. Solo cerrar toda la aplicación "elimina" el bloqueo. ¿Alguien sabe cómo liberar mi gdb y "eliminar" el bloqueo sin cerrar la aplicación?

AnnemieK
fuente
Busque en este sitio el "bloqueo de geodatabase de archivos", algunos de ellos podrían ayudar.
Chad Cooper
Por supuesto que busqué en el sitio antes. Pero desafortunadamente ninguna de las sugerencias me ayudó. Probé el Compact-GP, pero esto no desbloqueó el gdb. Tampoco parece ser un bloqueo huérfano, porque no puedo editar el gdb en ArcCatalog antes de cerrar mi aplicación. ¿Pero qué objeto tengo que liberar para desbloquear mi gdb además de liberar el espacio de trabajo?
AnnemieK
1
En gis.stackexchange.com/questions/6230/… , parece que puede haber encontrado un error. Si ninguna de las respuestas a continuación se aplica, haría un seguimiento con el soporte técnico de Esri.
Matt Wilkie

Respuestas:

2

Eché un vistazo rápido y encontré información sobre el escenario de bloqueo que parece estar teniendo. En ArcObjects 10 hay una opción SetWriteLock y FreeWriteLock.

eche un vistazo al enlace del foro específicamente la muestra de Lance Shipman de Esri http://forums.arcgis.com/threads/36881-the-performance-fgdb-api-amp-arcobjects

Diviértete, CDB

CDBrown
fuente
SetWriteLock y FreeWriteLock no están en ArcObjects sino en la API FileGeodatabase (separada de los arcobjects). Esta biblioteca puede escribir / liberar bloqueos, pero solo los que se crearon con esta biblioteca. El patrón del nombre de archivo es diferente (no incluye el nombre de la computadora, etc.).
mstaessen
2

Llegar a esta condición es fácil: todo lo que necesita es un objeto que contenga una referencia a algo que necesita el espacio de trabajo para mantenerse con vida. Como un objeto personalizado que contiene una característica, por ejemplo.

Una vez que esté seguro de no tener tales referencias, intente llamar a GC.collect () para forzar al recolector de basura a un modo de limpieza cuasi-determinista

Ragi Yaser Burhum
fuente
2

Si está utilizando cursores en su aplicación, asegúrese de utilizar ComReleaser para administrar la vida útil de los cursores y destruirlos cuando haya terminado con ellos. De lo contrario, pueden bloquear su DBMS. Podría estar equivocado, pero no creo que llamar a ReleaseComObject solo en el espacio de trabajo elimine la referencia a los cursores. Echa un vistazo a esta publicación de blog de ESRI ...

http://blogs.esri.com/Dev/blogs/geodatabase/archive/2008/12/18/Using-the-ComReleaser-to-manage-the-lifetime-of-cursors-in-.NET.aspx

Jeff Berry
fuente
0

Idea encontrada de http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//003n0000007w000000

"Estos archivos .lock se eliminan cada vez que ejecuta la herramienta compacta de geoprocesamiento"

string[] lockfiles = Directory.GetFiles(project.Path, "*.lock",   SearchOption.AllDirectories);

if(lockfiles.Length > 0)
{
int lockCt = 0;
while (lockCt < lockfiles.Length)
{
 string inFGDB = System.IO.Path.GetDirectoryName(lockfiles[lockCt]);

 ESRI.ArcGIS.DataManagementTools.Compact compactProcess = new   ESRI.ArcGIS.DataManagementTools.Compact();

 compactProcess.in_workspace = inFGDB;

 geoprocessor.Execute(compactProcess ,null);

  lockCt++;
}
}
Ajay
fuente