私はZODBを使用してキャッシュシステムを作成しています。私がDBに入れているオブジェクトは、__getstate__
と__setstate__
のメソッドを使う必要がありました。なぜなら、文字列に変換してBlobに格納するイメージが含まれているからです。ZODBトランザクションコミットは__getstate__を複数回呼び出します
私は似たような問題を抱えている人が見つかりませんでしたので、私は何か愚かなことをやっていると仮定しています。あなたは出力からわかるように、各トランザクションは、すべての以前のためのGETSTATEメソッドを呼び出し
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
:その結果
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()
:私がいる問題は、次のテストコードを実行することで見ることができますトランザクション。これは起こるはずですか/私は何が欠けていますか?私はトランザクションの使用を完全に誤解していますか?そのようなPersistentMappingsを使用しても問題ありませんか?
私はZODB 3.10.3とPython 2.6.3を使用しています。
P.S. 私は通常、すべての操作を実行した後にコミットを行うことはわかっていますが、このループは、ZODBからデータを追加または取得する「キャッシュ」オブジェクトで可能な一連のメソッド呼び出しを表しています。
ご協力いただきありがとうございます。追加の研究とテストの時間と時間後