2011-02-26 5 views
4

데비안 및 파이썬 2.7.1을 실행중인 웹 서버에서 ZODB 3.10.2를 사용하려고합니다. 2 개의 서로 다른 프로세스에서 동일한 데이터베이스에 액세스하려고 할 때마다 신비한 예외가 발생합니다. 나는 대화 형 파이썬 세션에서 데이터베이스에 액세스 시도하고 모든 것이 잘 작동하는 것 같았다 :ZODB의 zc.lockfile.LockError

>>> 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' 
>>> 

왜 이런 일이 발생합니까? 그것에 대해 무엇을 할 수 있습니까?

+0

답변 해 주셔서 감사합니다. ZODB가 다중 프로세스 액세스를 지원하지 않는다는 것을 알지 못했습니다. 선반과 같은 것을 찾고 있었지만 더 나은 동시성 지원이 필요했습니다. 한 프로세스에서 다른 프로세스로 데이터를 읽는 동안 데이터베이스에 안정적으로 데이터를 쓸 수 있어야합니다. 나는 ZEO를 시도 할 수도 있고 다른 곳에서도 볼 수도 있습니다. –

답변

11

ZODB는 다중 프로세스 액세스를 지원하지 않습니다. 이것이 잠금 오류를 얻는 이유입니다. ZODB 파일 저장소는 다른 프로세스가 변경하지 못하도록 한 프로세스에서 잠갔습니다.

이 문제를 해결하는 데는 여러 가지 방법이 있습니다. 가장 쉬운 방법은 ZEO을 사용하는 것입니다. ZEO는 네트워크를 통해 개체에 대한 액세스를 제공하는 ZODB 기계를 확장, 당신은 쉽게 로컬 FileStorage 파일 대신 ZEO 서버에 액세스 할 ZODB를 구성 할 수 있습니다

<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

동시에 두 프로세스에서 동일한 데이터베이스 파일에 액세스 할 수 없습니다 (명백 함). 그래서이 오류가 발생합니다. 두 개 이상의 프로세스에서 동일한 data.fs 파일에 대해 작업을 수행해야하는 경우 : ZEO를 사용하십시오.

+0

> (이것은 분명한 것입니다) 'sqlite'는 이것을 지원합니다 (엄청난 자물쇠가 있음에도 불구하고) –