Python ZODB中的zc.lockfile.LockError

Python ZODB中的zc.lockfile.LockError,python,zodb,Python,Zodb,我试图在运行Debian和Python2.7.1的web服务器上使用Zodb3.10.2。似乎每次我试图从两个不同的进程访问同一个数据库时,我都会遇到一个神秘的异常。我试着从一个交互式Python会话访问一个数据库,一切似乎都很好: >>> import ZODB >>> from ZODB.FileStorage import FileStorage >>> storage = FileStorage("test.db") >>

我试图在运行Debian和Python2.7.1的web服务器上使用Zodb3.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.FileStorage导入FileStorage >>>存储=文件存储(“test.db”) 找不到记录器“zc.lockfile”的处理程序 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/usr/local/lib/python2.7/site packages/ZODB3-3.10.2-py2.7-linux-x86_64.egg/ZODB/FileStorage/FileStorage.py”,第125行,在__ self.\u lock\u file=LockFile(文件名+'.lock') 文件“/usr/local/lib/python2.7/site packages/zc.lockfile-1.0.0-py2.7.egg/zc/lockfile/_init__.py”,第76行,在_init中__ _锁定文件(fp) 文件“/usr/local/lib/python2.7/site packages/zc.lockfile-1.0.0-py2.7.egg/zc/lockfile/_init__.py”,第59行,在锁文件中 raise LockError(“无法锁定%r”%file.name) zc.lockfile.LockError:无法锁定“test.db.lock” >>>
为什么会这样?对此可以做些什么?

您不能同时从两个进程访问相同的数据库文件(这是显而易见的)。这就是为什么会出现这个错误。如果需要从两个或多个进程对同一data.fs文件执行操作:请使用ZEO。

ZODB不支持多进程访问。这就是为什么会出现锁错误;ZODB文件存储已被一个进程锁定,以防止其他进程更改它

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

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

服务器本地主机:9100
另一个选项是使用,它将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>

#dsn是可选的,dsn中的每个参数也是可选的。
dsn dbname='zodb'用户='username'主机='localhost'密码='pass'

RelStorage需要更多的前期设置工作,但在许多情况下都可以优于ZEO。

谢谢您的回答。我不知道ZODB不支持多进程访问。我正在寻找类似shelve的东西,但是有更好的并发支持。我希望能够可靠地从一个进程写入数据库,同时从另一个进程读取。我可以试试ZEO,或者我可以到别处看看。这看起来像是个误会。ZODB支持多进程访问,非常好。只是文件存储模式不起作用。显然,使用RDBMS,当从多个ZODB源进行访问时,您将拥有多进程访问。与ZEO一起使用时也是如此。>(这很明显)
sqlite
支持这一点(尽管有一个巨大的锁)