Удалить блокировку на классе объектов

11

Когда я пытаюсь удалить класс пространственных объектов, после или во время использования приложения движка Arcgis, которое использует тот же класс пространственных объектов, у меня появляется ошибка, связанная с блокировкой, поэтому я не могу использовать эту блокировку, пока не перезапущу компьютер.

я хотел бы знать способ удаления блокировок с использованием arcpy или arcobjects 10.1, было бы идеально, если бы я мог использовать блокировку внутри приложения arcengine, которое также блокирует базу геоданных, я видел разные сообщения в SE о блокировках, но никто из них дает решение освободить блокировки с помощью ArcObjects.

geogeek
источник
1
У меня был похожий вопрос некоторое время назад ( gis.stackexchange.com/q/28977/8104 ). Мне не удалось найти ответ о блокировках, хотя была хорошая информация об удалении в памяти объектов.
Аарон

Ответы:

12

Если вы используете скрипты Arcpy, проблемы с блокировкой данных стали еще более проблематичными с 10.1.

Если блокировки создаются вашим кодом, то вы не убираете за собой. Отпустите все ссылки на классы пространственных объектов, рабочие области, курсоры и т. Д. Блокировки удаляются, когда у вас больше нет ссылок на блокируемые объекты.

Ну, это так, как это должно работать, но это редко работает. Обычно код будет работать время от времени, но часто неожиданно падает в разных местах.

Похоже, проблема заключается в том, что блокировки просто остаются на некоторое время «ненадолго», но код работает намного быстрее, чем скорость, с которой снимаются блокировки. Тем не менее, некоторые из встроенных инструментов Arc, по-видимому, требуют очистки блокировок по требованию (поскольку блокировки применяются ко всем GDB одновременно, блокировка не позволит вам работать с любым из содержащихся классов объектов). Эти инструменты являются arcpy.Compact_management () и arcpy.Exists ().

Вот небольшая функция, которую я использую в своем коде, что значительно повысило надежность (для скрипта, который создает и редактирует несколько GDB и классов объектов внутри них):

def clearWSLocks(inputWS):
  '''Attempts to clear locks on a workspace, returns stupid message.'''
  if all([arcpy.Exists(inputWS), arcpy.Compact_management(inputWS), arcpy.Exists(inputWS)]):
    return 'Workspace (%s) clear to continue...' % inputWS
  else:
    return '!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!' % inputWS

Он используется путем простой передачи пути к рабочему пространству (GDB) в функцию, и его следует выполнять после каждой операции с рабочим пространством (т. Е. Созданием GDB) или классами объектов в рабочем пространстве (т. Е. Курсорами, добавлением полей, вычислениями и т. Д.). , Например (показан здесь как автономный скрипт с функцией вверху; чтобы использовать функцию, скопируйте ее и вставьте между импортом и реальной программой, как показано здесь):

import arcpy

def clearWSLocks(inputWS):
  '''Attempts to clear locks on a workspace, returns stupid message.'''
  if all([arcpy.Exists(inputWS), arcpy.Compact_management(inputWS), arcpy.Exists(inputWS)]):
    return 'Workspace (%s) clear to continue...' % inputWS
  else:
    return '!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!' % inputWS

GDBpath = 'C:/Temp/'
GDBname = 'Test.gdb'
tableName = 'SweetFC'
arcpy.CreateFileGDB_management(GDBpath, GDBname)
print(clearWSLocks(GDBpath+GDBname))
arcpy.CreateTable_management(GDBpath+GDBname, tableName)
print(clearWSLocks(GDBpath+GDBname))
# etc....
StacyR
источник
3
Компакт не работает, если есть замок. Это действительно увеличит производительность, когда вы выполняете много операций FGDB, но за счет собственного времени выполнения.
Михалис Авраам
просто интересно, почему существует два раза Exists, я имею в виду третье утверждение в if all () в clearWSLocks?
Макак
Я могу согласиться, я не нашел это, чтобы очистить замки. :( и я уже пробовал много разных вещей.
Видар
8

Файловая база геоданных имеет 3 типа блокировок.

  1. SR - схема блокировки
  2. RD - чтение блокировки
  3. ED - редактировать блокировку

Предлагаемое решение по @StacyR будет работать во всех ситуациях , кроме исключительных редактирования замков (ED) в соответствии с ARCGIS справочной документации.

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//003n0000007t000000

JonBruce
источник
7

Если блокировки создаются вашим кодом, то вы не убираете за собой. Отпустите все ссылки на классы пространственных объектов, рабочие области, курсоры и т. Д. Блокировки удаляются, когда у вас больше нет ссылок на блокируемые объекты.

blah238
источник
1
Я знаю, что эта ветка довольно старая, но у меня возникла проблема с возможностью удаления FGDB внутри arcpy. Что именно вы подразумеваете под "Отпустите все ссылки на классы пространственных объектов, рабочие области, курсоры и т. Д." Как бы я выпустил упомянутые ссылки?
GeoJohn