我正在使用 ZODB 创建一个缓存系统。我放入数据库的对象要求我使用__getstate__
和__setstate__
方法,因为它们包含我转换为字符串并存储在 Blob 中的图像。
我没有找到任何有类似问题的人,所以我假设我在做一些愚蠢的事情。通过运行以下测试代码可以看到我遇到的问题:
from ZODB import FileStorage, DB
from persistent.mapping import PersistentMapping
import transaction
class Test(object):
def __init__(self, a):
self.a = a
def __getstate__(self):
print "Entering getstate for %s" % self.a
return self.__dict__.copy()
def __setstate__(self, state):
print "Entering setstate for %s" % state["a"]
self.__dict__ = state
print "Creating tests..."
tests = [ Test(i) for i in range(3) ]
print "Connecting to database..."
storage = FileStorage.FileStorage("./test_db.fs", blob_dir="./test_blobs")
db = DB(storage)
conn = db.open()
root = conn.root()
root["cache"] = PersistentMapping()
transaction.commit()
print "Adding tests to db..."
for idx,t in enumerate(tests):
print "Starting transaction of idx %d" % idx
root["cache"][idx] = t
transaction.commit()
结果是:
Creating tests...
Connecting to database...
Adding tests to db...
Starting transaction of idx 0
Entering getstate for 0
Starting transaction of idx 1
Entering getstate for 0
Entering getstate for 1
Starting transaction of idx 2
Entering getstate for 0
Entering getstate for 1
Entering getstate for 2
正如您从输出中看到的那样,每笔交易都会为之前的每笔交易调用 getstate 方法。这应该发生/我错过了什么?我完全误解了事务的使用吗?像这样使用 PersistentMappings 可以吗?
我正在使用 ZODB 3.10.3 和 Python 2.6.3。
PS 我知道通常你会在完成所有操作后进行提交,但是循环表示“缓存”对象中的一系列可能的方法调用,每个方法调用都可以从 ZODB 添加或检索数据。
感谢您提供的任何帮助或理解。