我正在Pyramid框架上构建一个应用程序,并希望使用web2py-DAL。 Firebird-embedded是首选的数据库。
这很有效,直到我尝试异步调用一个网页中的多个视图。不同的错误,如“无效的游标状态”,“无效的游标引用”或“尝试重新关闭一个关闭的游标”都来自kinterbasdb驱动程序,其中sqlite只是在没有任何错误消息的情况下发生故障并使用python。这些视图的callables只是通过SELECTing进行简单的读取。
在金字塔根工厂为每个请求返回相同的DAL对象的情况下会发生这种情况。似乎线程形成不同的请求正在使用相同的游标对象,因此游标关闭,而另一个线程假定光标在这里。
如果我在每个请求上创建一个新的DAL对象,我会遇到另一个问题 - 每个请求上的每个新连接都会分配内存,而这个内存不会被释放。因此,在一些教师要求之后,有几百MB的浪费内存。
不幸的是,Sqlalchemy不是这个项目的选择。
有什么想法吗?
答案 0 :(得分:2)
关键是应该在每个请求上创建DAL对象。但之后必须手动关闭。
我是这样做的:有一个
request.add_finished_callback
请求对象的属性,所以我以这种方式扩展了DAL对象:
class Root(DAL):
def __init__(self, request, uri):
DAL.__init__(self, uri, pool_size=0)
request.add_finished_callback(self._close)
def _close(self, request):
self._adapter.close_all_instances('commit')
每个请求都会由root_factory返回一个新的Root对象。
感谢web2py-users群组!
答案 1 :(得分:1)