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

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

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

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

【问题讨论】:

    标签: django postgresql django-views long-polling gevent


    【解决方案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 时,我们仍然有空闲连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2015-05-16
    • 2011-04-20
    • 2012-08-16
    • 2013-01-02
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多