2012-02-15 110 views
7

我實現了一個聊天,使用ajax長輪詢和Gevent。 要讀取客戶端ajax的更新視圖,請用 Gevent.event.wait等待更新。Django,Ajax長輪詢,Postgresql:空閒事務

問題: Django在請求(獲取會話信息)開始時打開的Postgresql事務直到請求結束才關閉。而那些閒置的交易需要大量的內存。

如何在不關閉請求的情況下關閉Postgresql事務 最乾淨的方法是什麼?我目前手動發送 request_finished信號,但感覺像是一個黑客。

回答

2

你這樣做的方式可能是在你的黑客的框架內最好的方式。是否有任何理由試圖讓長時間投票進入請求響應過程而不是使用類似django-socketio的東西?

+0

我們花了很長時間試圖通過gent/gunicorn/apache(後端)通過nginx(前端)來完成socketio工作。 如果沒有大量的mod,Nginx無法做到這一點。 即使對於這些,我們也無法將socketio用戶標識與django會話標識鏈接起來,因此我們無法獲取用戶信息。如果你有一個完整的教程來推薦,我們很樂意看到它。我們發現的大部分socketio - chat教程都不使用django用戶信息或前端。 – Ashe 2012-02-16 00:52:44

+1

至於使SocketIO和django auth後端一起工作:https://gist.github.com/fd8e9631368e447de702 – 2012-02-16 13:38:05

+0

說實話,我們現在不會回滾,但我們將明確保留,以備後用。謝謝。 – Ashe 2012-02-16 20:44:33

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連接池。你應該看到一些這樣做可觀的性能收益。

+0

我們試着回滾,我們會用提交進行測試,並驗證答案是否有效。並看看你推薦的技術。感謝你的回答! – Ashe 2012-02-16 11:30:11

+0

這不適合我們。我猜這個事務在commit_manually裏面打開了,之前由django打開的是不一樣的(或者我們不明白)。當我們使用這種技術而不是我們的(醜陋)黑客時,我們仍然有空閒的聯繫。 – Ashe 2012-02-16 22:33:29