Jak zwolnić blokadę na gdb?

11

Mam problemy z wydaniem mojego gdb w ArcGIS10. Moje narzędzie działa z lokalnym pakietem gdb, ale nie udało mi się go zwolnić po zakończeniu procesu. W Ag9.3 mogę go wypuścić po prostu przez Marshal.ReleaseComObject (obszar roboczy), ale to nie działa w AG10. Również zwolnienie wszystkich FeatureCursors nie pomaga. Tylko zamknięcie całej aplikacji „usuwa” blokadę. Czy ktoś wie, jak zwolnić mój plik gdb i „usunąć” blokadę bez zamykania aplikacji?

AnnemieK
źródło
Wyszukaj w tej witrynie hasło „blokada geobazy danych”, niektóre z nich mogą pomóc.
Chad Cooper
Oczywiście wcześniej przeszukiwałem witrynę. Ale niestety żadna z sugestii mi nie pomogła. Próbowałem Compact-GP, ale to nie odblokowało gdb. Nie wydaje się też, aby był to osierocony zamek, ponieważ nie mogę edytować gdb w ArcCatalog przed zamknięciem mojej aplikacji. Ale jaki obiekt muszę zwolnić, aby odblokować mój GBD oprócz zwolnienia obszaru roboczego?
AnnemieK
1
Z gis.stackexchange.com/questions/6230/… wygląda na to, że mógł wystąpić błąd. Jeśli żadna z poniższych odpowiedzi nie ma zastosowania, skorzystam z pomocy technicznej Esri.
matt wilkie

Odpowiedzi:

2

Rzuciłem okiem i znalazłem informacje na temat scenariusza blokowania, który prawdopodobnie masz. W ArcObjects 10 dostępna jest opcja SetWriteLock i FreeWriteLock.

spójrz na link do forum, a konkretnie próbkę od Lance Shipman z Esri http://forums.arcgis.com/threads/36881-the-performance-fgdb-api-amp-arcobjects

Baw się dobrze, CDB

CDBrown
źródło
SetWriteLock i FreeWriteLock nie znajdują się w ArcObjects, ale w API FileGeodatabase (oddzielne arcobjects). Ta biblioteka może zapisywać / zwalniać blokady, ale tylko te, które zostały utworzone za pomocą tej biblioteki. Wzorzec nazwy pliku jest inny (nie zawiera nazwy komputera itp.).
mstaessen,
2

Dotarcie do tego stanu jest łatwe - wystarczy jeden obiekt, który zawiera odniesienie do czegoś, co wymaga przestrzeni roboczej, aby pozostać przy życiu. Jak na przykład niestandardowy obiekt zawierający funkcję.

Gdy masz pewność, że nie masz takich odniesień, spróbuj wywołać GC.collect (), aby zmusić moduł wyrzucający śmieci do quasi-deterministycznego trybu czyszczenia

Ragi Yaser Burhum
źródło
2

Jeśli używasz kursorów w swojej aplikacji, upewnij się, że używasz ComReleaser do zarządzania czasem życia kursorów i niszczenia ich, gdy skończysz z nimi. W przeciwnym razie mogą zablokować DBMS. Mogę się mylić, ale nie wydaje mi się, że wywołanie ReleaseComObject na samym obszarze roboczym usuwa odwołanie do kursorów. Spójrz na ten post na blogu 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
źródło
0

Znaleziony pomysł z http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//003n0000007w000000

„Te pliki .lock są usuwane przy każdym uruchomieniu narzędzia Compact geoprocessing”

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
źródło