3

我正在 Pyramid 框架上构建一个应用程序,并希望将 web2py-DAL 与它一起使用。Firebird-embedded 是首选的数据库。

在我尝试从一个网页异步调用多个视图之前,这非常有效。kinterbasdb 驱动程序会出现不同的错误,例如“无效的游标状态”、“无效的游标引用”或“尝试重新关闭关闭的游标”,其中 sqlite 只是在没有任何错误消息的情况下发生故障并使用 python。这些视图可调用对象只是通过 SELECTing 进行简单读取。

这种情况发生在金字塔根工厂为每个请求返回相同的 DAL 对象的情况下。似乎来自不同请求的线程正在使用相同的游标对象,因此游标被关闭,而另一个线程假定游标在这里。

如果我在每个请求上创建一个新的 DAL 对象,我会遇到另一个问题——每个请求上的每个新连接都会分配内存,而这个内存不会被释放。因此,在一些文档请求之后,有数百 MB 的内存被浪费了。

不幸的是,Sqlalchemy 不是这个项目的选择。

有什么想法吗?

4

2 回答 2

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组!

于 2011-04-06T18:09:26.763 回答
1

web2py 邮件列表中的一些解决方案。

于 2011-04-06T12:18:22.060 回答