Tornadoで構築された小さな Web アプリがあり、データ ストレージにZODBを使用したいと考えています。ZODB ドキュメントによると、マルチスレッド プログラムはサポートされていますが、スレッドごとに新しい接続を開始する必要があります。それは私が何かをしなければならないことを意味すると思います
### On startup
dbFilename = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Data.fs")
db = DB(FileStorage(dbFilename))
### Example handler
class Example(tornado.web.RequestHandler):
def get(self):
try:
conn = db.open()
root = conn.root()
### do stuff with root here
root._p_changed = 1 ## Include these lines for writes
transaction.commit() ## on sub-elements
finally:
conn.close()
まず、新しい接続は、すべての db 対話ハンドラーまたは書き込みを行うハンドラーにまだ必要ですか? 起動時に 1 つの接続を開始し、それをすべての読み取りに使用してから、何かを書き込む必要がある場合にのみ上記の接続の歌と踊りを行うのは合理的でしょうか?
第二に、Python でそのパターンを抽象化する慣用的な方法は何ですか? 私は次のようなものを持っています
def withDB(fn):
try:
conn = db.open()
root = conn.root()
res = fn(root)
root._p_changed = 1
transaction.commit()
return res
finally:
conn.close()
def delete(formName):
def local(root):
### do stuff with root here
return withDB(local)
心に留めていますが、それはおそらく私の Lisp の表示です。
アプローチに関する一般的なヘッドチェックも歓迎します。