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

7
我用ajax长轮询和Gevent实现了一个聊天功能。客户端ajax更新视图并使用Gevent.event.wait等待更新。
问题:Django在请求开始时打开的Postgresql事务(获取会话信息)直到请求结束才关闭。这些空闲事务占用了大量内存。
最干净的方法是什么来关闭Postgresql事务而不关闭请求?我目前正在手动发送request_finished信号,但感觉像个hack。
2个回答

2

在你的hack框架内,你现在采用的方法可能是最好的。你尝试将长轮询(shoe-horn long-poll)纳入请求-响应过程,而不是使用类似django-socketio这样的工具,有什么原因吗?


我们花费了很长时间尝试通过nginx(前端)与gevent/gunicorn/apache(后端)使socketio工作。 Nginx无法在没有大量修改的情况下实现这一点。 即使有了这些修改,我们也无法将socketio用户ID与django会话ID关联起来,因此我们无法获取用户信息。如果您有完整的教程推荐,我们很乐意查看。我们找到的大多数socketio-chat教程都不使用django用户信息或前端。 - Ashe
1
关于如何使SocketIO和Django认证后端一起工作:https://gist.github.com/fd8e9631368e447de702 - Stephen Diehl
说实话,我们现在不会回滚,但我们肯定会将其保留以备后用。谢谢。 - Ashe

0
请看这里: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 连接池。这样做可以带来相当可观的性能提升。


我们尝试了回滚,现在将进行提交测试,并验证其是否有效。同时,我们会查看您推荐的技术。感谢您的回答! - Ashe
它对我们不起作用。我猜在commit_manually中打开的事务和Django之前打开的事务不是同一个(或者有些东西我们没理解)。当我们使用这种技巧时,仍然存在空闲连接,而不是我们(丑陋的)hack方式。 - Ashe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接