gpt4 book ai didi

firebird - 带 Pyramid 的独立 web2py-DAL - 请求、线程和内存

转载 作者:行者123 更新时间:2023-12-02 21:57:47 25 4
gpt4 key购买 nike

我正在 Pyramid 框架上构建一个应用程序,并希望使用 web2py-DAL。 Firebird 嵌入式是首选数据库。

这非常有效,直到我尝试从一个网页异步调用多个 View 。 kinterbasdb 驱动程序会出现不同的错误,例如“无效的游标状态”、“无效的游标引用”或“尝试重新关闭已关闭的游标”,其中 sqlite 会崩溃,没有任何错误消息,并会使用 python。这些 View 可调用函数除了通过 SELECTing 进行简单读取之外什么也不做。

如果 Pyramid 根工厂为每个请求返回相同的 DAL 对象,就会发生这种情况。似乎形成不同请求的线程正在使用相同的游标对象,因此游标被关闭,而另一个线程假设游标位于此处。

如果我在每个请求上创建一个新的 DAL 对象,我会遇到另一个问题 - 每个请求上的每个新连接都会分配内存,并且该内存不会被释放。因此,在一些讲解员请求后,有数百 MB 的内存被浪费。

不幸的是,Sqlalchemy 不适合这个项目。

有什么想法吗?

最佳答案

重点是应该在每个请求上创建 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组!

关于firebird - 带 Pyramid 的独立 web2py-DAL - 请求、线程和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5539722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com