gpt4 book ai didi

python - ZODB 中的 zc.lockfile.LockError

转载 作者:太空狗 更新时间:2023-10-30 01:47:14 25 4
gpt4 key购买 nike

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

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

但后来我尝试了来自同时运行的另一个 session 的同一系列命令,但似乎没有用:

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

为什么会这样?可以做些什么?

最佳答案

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。

关于python - ZODB 中的 zc.lockfile.LockError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5128807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com