Django,Ajax 长轮询,Postgresql:空闲事务

Posted

技术标签:

【中文标题】Django,Ajax 长轮询,Postgresql:空闲事务【英文标题】:Django, Ajax long polling, Postgresql: idle transaction 【发布时间】:2012-03-07 09:07:28 【问题描述】:

我使用 ajax 长轮询和 Gevent 实现了一个聊天。 要阅读,客户端 ajax 更新视图并等待 Gevent.event.wait 等待更新。

问题: Django 在请求开始时打开的 Postgresql 事务(用于获取会话信息)直到请求结束才关闭。而那些空闲的事务会占用大量内存。

关闭 Postgresql 事务最干净的方法是什么 不关闭请求?我目前正在发送 request_finished 手动发出信号,但感觉就像是 hack。

【问题讨论】:

【参考方案1】:

无论如何,你的做法可能是你的 hack 框架内最好的方法。您是否有任何理由尝试在请求响应过程中进行长轮询,而不是使用 django-socketio 之类的东西?

【讨论】:

我们花了很长时间试图通过 nginx(前端)和 gevent/gunicorn/apache(后端)使 socketio 工作。如果没有大量的模组,Nginx 就无法做到这一点。即使有了这些,我们也无法将 socketio 用户 ID 与 django 会话 ID 链接起来,因此我们无法获取用户信息。如果您有完整的教程要推荐,我们很乐意看到它。我们找到的大部分socketio-chat教程,都没有使用django用户信息或者前端。 就使 SocketIO 和 django auth 后端一起工作而言:gist.github.com/fd8e9631368e447de702 老实说,我们现在不会回滚,但我们会明确地保留它以备后用。谢谢。【参考方案2】:

请看这里:https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_manually

@transaction.commit_manually
def yourview(request):
    # do your db actions
    transaction.commit()

或者,如果您更喜欢上下文管理器:

def yourview(request):
    ...
    with transaction.commit_manually():
         # do your db actions
    ...

此外,如果您在保持 PostgreSQL 连接打开时遇到内存问题,您应该使用 pgbouncer 或现有的各种 gevent 连接池寻找池解决方案。这样做您应该会看到一些可观的性能提升。

【讨论】:

我们尝试了回滚,我们将使用提交进行测试并验证答案是否有效。看看你推荐的技术。感谢您的回答! 这对我们不起作用。我猜在 commit_manually 中打开的事务和之前由 django 打开的事务不一样(或者有些东西我们不明白)。当我们使用这种技术而不是我们的(丑陋的)hack 时,我们仍然有空闲连接。

以上是关于Django,Ajax 长轮询,Postgresql:空闲事务的主要内容,如果未能解决你的问题,请参考以下文章

如何从长轮询中获取响应数据?

用大白话揭开Ajax长轮询(long polling)的神秘面纱

Ajax 长轮询

ajax长轮询

ajax轮询与长轮询

轮询与长轮询[关闭]