zc.lockfile.LockError в ZODB - PullRequest
       12

zc.lockfile.LockError в ZODB

4 голосов
/ 26 февраля 2011

Я пытаюсь использовать ZODB 3.10.2 на своем веб-сервере с Debian и Python 2.7.1.Кажется, что каждый раз, когда я пытаюсь получить доступ к одной и той же базе данных из 2 разных процессов, я получаю загадочное исключение.Я попытался получить доступ к базе данных из интерактивного сеанса Python, и все, казалось, работало нормально:

>>> import ZODB
>>> from ZODB.FileStorage import FileStorage
>>> storage = FileStorage("test.db")
>>> 

Но затем я попробовал ту же серию команд из другого сеанса, работающего в то же время, и это, похоже, не помоглоработа:

>>> import ZODB
>>> from ZODB.FileStorage import FileStorage
>>> storage = FileStorage("test.db")
    No handlers could be found for logger "zc.lockfile"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/ZODB3-3.10.2-py2.7-linux-x86_64.egg/ZODB/FileStorage/FileStorage.py", line 125, in __init__
    self._lock_file = LockFile(file_name + '.lock')
  File "/usr/local/lib/python2.7/site-packages/zc.lockfile-1.0.0-py2.7.egg/zc/lockfile/__init__.py", line 76, in __init__
    _lock_file(fp)
  File "/usr/local/lib/python2.7/site-packages/zc.lockfile-1.0.0-py2.7.egg/zc/lockfile/__init__.py", line 59, in _lock_file
    raise LockError("Couldn't lock %r" % file.name)
zc.lockfile.LockError: Couldn't lock 'test.db.lock'
>>>

Почему это происходит?Что с этим можно сделать?

Ответы [ 2 ]

11 голосов
/ 26 февраля 2011

ZODB не поддерживает многопроцессорный доступ.Вот почему вы получаете ошибку блокировки;хранилище файлов ZODB было заблокировано одним процессом, чтобы другие процессы не могли его изменить.

Существует несколько способов обойти это.Самый простой вариант - использовать ZEO .ZEO расширяет механизм ZODB для предоставления доступа к объектам по сети, и вы можете легко настроить ZODB для доступа к серверу ZEO вместо локального файла FileStorage:

<zodb>
    <zeoclient>
    server localhost:9100
    </zeoclient>
</zodb>

Другой вариант - использовать RelStorage , который хранит данные ZODB в реляционной базе данных.RelStorage поддерживает бэкэнды PostgreSQL, Oracle и MySQL.RelStorage обеспечивает одновременный доступ от разных клиентов ZODB.Вот пример конфигурации:

<zodb>
  <relstorage>
    <postgresql>
      # The dsn is optional, as are each of the parameters in the dsn.
      dsn dbname='zodb' user='username' host='localhost' password='pass'
    </postgresql>
  </relstorage>
</zodb>

RelStorage требует больше предварительной настройки, но может превзойти ZEO во многих сценариях.

3 голосов
/ 26 февраля 2011

Вы не можете получить доступ к одним и тем же файлам базы данных из двух процессов одновременно (что очевидно). Вот почему вы получаете эту ошибку. Если вам нужно выполнить действия над одним и тем же файлом data.fs из двух или более процессов: используйте ZEO.

...