2014-09-02 2 views
2

저는 PostgreSQL 9.3 및 SQLAlchemy 0.8.2를 실행 중이며 데이터베이스 연결이 누출되는 것을 경험합니다. 앱을 배포 한 후 약 240 개의 연결을 사용합니다. 다음 30 시간 동안이 숫자는 PostgreSQL이 연결을 끊기 시작할 때 점차 500까지 증가합니다.데이터베이스 연결 누설 : PostgreSQL, SQLAlchemy, Flask

내가 SQLAlchemy의 thread-local sessions 사용 :

@app.teardown_request 
def teardown_request(exception=None): 
    if not app.testing: 
     Session.remove() 

이것은와 동일해야합니다 :

플라스크 웹 앱
from sqlalchemy import orm, create_engine 

engine = create_engine(os.environ['DATABASE_URL'], echo=False) 
Session = orm.scoped_session(orm.sessionmaker(engine)) 

Session 프록시 객체에 .remove() 호출 요청 분해시 전송입니다 what Flask-SQLAlchemy 뭐하는거야?

나는 또한 루프에서 실행 약간의주기적인 작업을, 나는 루프의 모든 반복에 대해 .remove() 전화 :

def run_forever(): 
    while True: 
     do_stuff(Session) 
     Session.remove() 

내가 잘못 뭐하는 거지 연결 누출에게로 이어질 수 있을까?

+1

flask-sqlalchemy로 태그를 지정했지만 세션을 관리하기 위해 flask-sqlalchemy를 사용하지 않는 이유가 있습니까? – davidism

+2

또한 백그라운드 작업을 실행하는 것은 정말 나쁜 방법입니다. 샐러리를 사용할 것을 고려하십시오. Flask 문서의 태스크에 앱 컨텍스트와 db 세션을 가져 오는 패턴이 있습니다. – davidism

+1

앱은 어떻게 배포됩니까? –

답변

0

우선, 백그라운드 작업을 실행하는 것은 정말 나쁜 방법입니다. 셀러리와 같은 ASync 스케줄러를 사용해보십시오.

100 % 확신 할 수 없으므로 제공된 정보를 기반으로 추측됩니다. 그러나 각 페이지로드가 알림을 수신하는 새 db 연결을 시작하는지 궁금합니다. 이 경우 db 연결이 풀에서 효과적으로 제거되어 다음 페이지로드시 생성되는지 궁금합니다.

이 경우 내 권장 사항은 별도의 DBI 데이터베이스 핸들을 알림 청취 전용으로 사용하여 대기열에서 활성화되지 않도록하는 것입니다. 이는 워크 플로우 외부에서 수행 될 수 있습니다.

또한

이상의 동시적인 요청을 할 때 특히, 누출이 발생된다. 동시에 요청 중 일부가 완료되지 않은 쿼리 실행 및 시간 초과로 남아 있음을 알 수있었습니다. 직접 관리 할 수있는 무언가를 쓸 수 있습니다.

3

SQLAlchemy를 사용한 실험에서 올바르게 기억하면 scoped_session()을 사용하여 여러 위치에서 액세스 할 수있는 세션을 만들 수 있습니다. 즉, 하나의 메소드에서 세션을 작성하고 명시 적으로 세션 오브젝트를 전달하지 않고 다른 세션에서 세션을 사용합니다. 세션 목록을 유지하고 "범위 ID"와 연결하여 세션을 유지합니다. 기본적으로 범위 ID를 얻으려면 현재 스레드 ID를 사용합니다. 그래서 당신은 스레드 당 세션을 갖습니다. 당신은 scopefunc를 제공하기 위해 제공 할 수 있습니다 - - 예를 들어, 하나 개의 ID 요청에 따라 :

# This is (approx.) what flask-sqlalchemy does: 
from flask import _request_ctx_stack as context_stack 

Session = orm.scoped_session(orm.sessionmaker(engine), 
          scopefunc=context_stack.__ident_func__) 

또한, 백그라운드 작업을 수행에 대한 다른 답변과 의견을주의 깊게 살펴.

+1

또한 0.9에서 대부분의 경우에 더 적합한'_app_ctx_stack'이 있음에 유의하십시오. https://github.com/mitsuhiko/flask/blob/7f3867491570746a4c14bdaa5bd59ec1b64cbfea/docs/upgrading.rst#version-09 – awsum

관련 문제