我正在尝试在运行 Debian 和 Python 2.7.1 的 Web 服务器上使用 ZODB 3.10.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'
>>>
为什么会发生这种情况?对此我们能做些什么呢?
ZODB不支持多进程访问。这就是为什么你会收到锁定错误; ZODB 文件存储已被一个进程锁定,以防止其他进程更改它。
有几种方法可以解决这个问题。最简单的选择是使用ZEO。 ZEO 扩展了 ZODB 机制以提供通过网络访问对象的功能,并且您可以轻松配置 ZODB 以访问 ZEO 服务器而不是本地 FileStorage 文件:
<zodb>
<zeoclient>
server localhost:9100
</zeoclient>
</zodb>
另一种选择是使用相关存储,它将 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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)