我正在用webpy写一个小小的网络应用程序,我想知道是否有人有任何关于我遇到的小问题的信息。
我写了一个小的ORM系统,它似乎工作得很好。理想情况下,我想用webpy将其拼接,但似乎只是使用它会导致线程问题(跨越线程边界实例化/访问数据库连接,或者异常状态)。
有没有人知道我(在webpy中)如何在与页面处理代码的其余部分相同的线程上创建我的数据库连接?
答案 0 :(得分:4)
我们将SQLAlchemy与web.py一起使用,并使用钩子为每个请求创建和关闭数据库连接。 SQLAlchemy处理池化,因此并非每个连接都是tcp连接。
您要使用的线程本地存储是web.ctx即。无论何时访问web.ctx,您只能看到该线程设置的属性。
我们的代码看起来像这样:
def sa_load_hook():
web.ctx.sadb = Session()
def sa_unload_hook():
web.ctx.sadb.close()
web.loadhooks['sasession'] = sa_load_hook
web.unloadhooks['sasession'] = sa_unload_hook
用您的数据库连接函数替换会话,它应该可以正常工作。
答案 1 :(得分:2)
我会试试这个。免责声明:我没有使用web.py框架的经验。
我建议您尝试以下方法:
(1)创建一个全局的threading.local实例来跟踪你的线程本地对象(在你的情况下,它将只跟踪一个对象,一个数据库会话)。
import threading
serving = threading.local()
(2)在每个请求开始时,创建一个数据库连接/会话并将其保存在threading.local实例中。如果我正确理解web.py documentation,您可以执行以下操作:
def setup_dbconnection(handler):
serving.dbconnection = create_dbconnection(...)
try:
return handler()
finally:
serving.dbconnection.close() # or similar
app.add_processor(setup_dbconnection)
(3)在你的控制器方法中(如果在web.py中调用它们),无论何时需要数据库连接,都要使用serve.dbconnection。