2012-02-15 2 views
7

ajax long polling과 Gevent를 사용하여 채팅을 구현했습니다. 클라이언트를 읽으려면 업데이트보기를 실행하고 을 기다립니다. 업데이트를 기다립니다.Django, Ajax long polling, Postgresql : 유휴 트랜잭션

문제 : 요청 시작시 Django에서 열린 (세션 정보를 얻기 위해) PostgreSQL 트랜잭션은 요청이 끝날 때까지 닫히지 않습니다. 그리고 유휴 트랜잭션은 많은 메모리를 사용합니다.

요청을 종료하지 않고 Postgresql 트랜잭션 을 닫는 가장 깨끗한 방법은 무엇이겠습니까? 현재 request_finished 신호를 수동으로 보내고 있지만 해킹처럼 느껴집니다.

답변

2

어쨌든 해킹 프레임 워크 내에서 최선의 방법 일 것입니다. django-socketio과 같은 것을 사용하는 대신 요청/응답 프로세스에 긴 폴을 넣으려는 이유가 있습니까? 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() 

아니면 상황에 맞는 관리자 선호하는 경우 :

+0

우리는 gevent/gunicorn/apache (백엔드)를 사용하여 nginx (프론트 엔드)를 통해 socketio 작업을 시도하는 데 오랜 시간을 보냈습니다. Nginx는 많은 양의 개조 물 없이는 그렇게 할 수 없습니다. 그런 경우에도 socketio 사용자 ID를 django 세션 ID와 연결할 수 없어 사용자 정보를 얻을 수 없었습니다. 추천할만한 튜토리얼을 가지고 있다면, 그것을보고 싶을 것입니다. 대부분의 socketio - chat 튜토리얼은 django 사용자 정보 나 프론트 엔드를 사용하지 않습니다. – Ashe

+1

SocketIO 및 django auth 백엔드가 함께 작동하도록 만드는 방법은 다음과 같습니다. https://gist.github.com/fd8e9631368e447de702 –

+0

솔직히 롤백하지는 않지만 나중에 다시 사용하도록하겠습니다. 고맙습니다. – Ashe

0

여기를 참조하십시오 또한

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

당신이 PostgreSQL의 연결을 잡고 메모리 문제가 발생하는 경우 pgbouncer를 사용하여 풀링 솔루션을 찾아야한다 열거 나 존재하는 다양한 gevent 연결 풀. 이렇게하면 상당한 성능 향상을 볼 수 있습니다.

+0

우리는 롤백을 시도 했으므로 커밋으로 테스트를하고 작동하는 경우 응답을 확인합니다. 그리고 추천 한 테크놀러지를 살펴보십시오. 답변 해주셔서 감사합니다! – Ashe

+0

그것은 우리에게 효과가 없습니다. 나는 트랜잭션이 commit_manually 안에 열렸고 django가 이전에 여는 트랜잭션은 같지 않다 (또는 우리가 이해하지 못하는 것이있다). 우리가 우리의 (못생긴) 해킹 대신이 기술을 사용할 때 우리는 여전히 유휴 연결을 가지고 있습니다. – Ashe

관련 문제