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

标签 firebird wsgi web2py pyramid firebird-embedded

我正在 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/

相关文章:

firebird - 了解 Firebird 监控表中的 MON$STAT_ID

performance - Firebird 会进行碎片整理吗?如果是这样,像聚集索引?

mysql - web2py是否支持在数据库中创建触发器

css - 如何在图表上滑动图像

ruby-on-rails - 使用 SOLR 作为后端的最高效的前端框架是什么?

sql - Firebird SQL : Subquery within an ALTER statement?

python - 在 heroku python 教程中,virtualenv 问题安装 wsgiref(ez_setup 语法错误?)

python - Apache mod_wsgi 和 python 2.7

django.core.exceptions.ImproperlyConfigured : WSGI application '{project_name}.wsgi.application' could not be loaded; Error importing module

c# - 选择其中列 1 = 1 且列 2 = MAX(列 2)