我正在金字塔框架上建立一个应用程序,并想使用它的web2py-DAL。Firebird-embedded是首选的数据库。
这很有效,直到我尝试从一个网页异步调用多个视图。来自kinterbasdb驱动程序的不同错误,如“无效游标状态”、“无效游标引用”或“尝试重新关闭已关闭的游标”,sqlite只是在没有任何错误消息的情况下崩溃,并使用python。这些视图可调用代码除了由SELECTing进行简单的读取外,什么也不做。
这发生在金字塔根工厂为每个请求返回相同的DAL对象的情况下。似乎来自不同请求的线程正在使用相同的游标对象,所以游标被关闭,而另一个线程假定游标在这里。
如果我在每个请求上创建一个新的DAL对象,我会遇到另一个问题--每个请求上的每个新连接都会分配内存,而这个内存不会被释放。因此,在一些文档请求之后,会有数百MB的内存被浪费。
不幸的是,Sqlalchemy不是这个项目的选项。
有什么想法吗?
发布于 2011-04-07 02:09:27
重点是应该在每个请求上创建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在每次请求时返回一个新的根对象。
感谢web2py-users小组!
发布于 2011-04-06 20:18:22
web2py邮件列表中的Some solutions。
https://stackoverflow.com/questions/5539722
复制相似问题