首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZODB中的zc.lockfile.LockError

ZODB中的zc.lockfile.LockError
EN

Stack Overflow用户
提问于 2011-02-27 02:16:39
回答 3查看 4.3K关注 0票数 4

我正尝试在运行Debian和Python 2.7.1的web服务器上使用ZODB 3.10.2。似乎每次我试图从两个不同的进程访问同一个数据库时,都会得到一个神秘的异常。我尝试从交互式Python会话访问数据库,一切似乎都很正常:

代码语言:javascript
复制
>>> import ZODB
>>> from ZODB.FileStorage import FileStorage
>>> storage = FileStorage("test.db")
>>> 

但随后我尝试了在同一时间运行的另一个会话中的同一系列命令,但似乎不起作用:

代码语言:javascript
复制
>>> 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'
>>>

为什么会发生这种情况?如之奈何?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-27 02:44:07

ZODB不支持多进程访问。这就是出现锁定错误的原因;ZODB文件存储已被一个进程锁定,以防止其他进程对其进行更改。

有几种方法可以解决这个问题。最简单的选择是使用ZEO。ZEO扩展了ZODB机制,通过网络提供对对象的访问,您可以轻松地配置ZODB以访问ZEO服务器,而不是本地FileStorage文件:

代码语言:javascript
复制
<zodb>
    <zeoclient>
    server localhost:9100
    </zeoclient>
</zodb>

另一种选择是使用RelStorage,它将ZODB数据存储在关系数据库中。RelStorage支持PostgreSQL、Oracle和MySQL后端。RelStorage负责从不同的ZODB客户端进行并发访问。下面是一个配置示例:

代码语言:javascript
复制
<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。

票数 11
EN

Stack Overflow用户

发布于 2011-02-27 02:34:50

您不能同时从两个进程访问相同的数据库文件(这是显而易见的)。这就是你得到这个错误的原因。如果您需要在来自两个或更多进程的同一data.fs文件上执行操作:使用ZEO。

票数 3
EN

Stack Overflow用户

发布于 2021-12-18 12:37:34

代码语言:javascript
复制
## Let the program run once (if it's already running, don't run it again)
## Run the program, open the form
import sys
import zc.lockfile
try:
    lock = zc.lockfile.LockFile('lock', content_template='{pid};{hostname}')
    if __name__ == '__main__':
        mainForm()
except zc.lockfile.LockError:
    sys.exit()

## zc.lockfile thanks
## https://pypi.org/project/zc.lockfile/#detailed-documentation
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5128807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档