我有一个用Tornado构建的小型网络应用程序,我想在其中使用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-interacting 处理程序还是只需要进行写入的处理程序,新连接是否仍然需要?在启动时启动一个连接并将其用于我所有的阅读是否合理,然后仅在我需要写东西时才进行上述连接歌舞?
其次,在 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 展示。
也欢迎对该方法进行一般性的头部检查。