2010-07-29 19 views
38

Używam sqlalchemy z MySQL i wykonanie zapytania z wyrażeniem sql. Podczas wykonywania pewnej liczby zapytań upływa limit czasu. Znalazłem answer, ale nie jest to dla mnie jasne. Proszę, ktoś może mi pomóc?Sql Alchemy connection time Out

TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30

+4

To zależy od tego, w jaki sposób korzystasz z sesji i jak tworzysz swój silnik. Jeśli używasz sesji lokalnych z wątkami, a ilość wątków jest większa niż rozmiar puli połączeń zdefiniowany w engine(), wystarczy zwiększyć rozmiar puli. Jeśli korzystasz z aplikacji jednowątkowych, to Greg ma rację i przeciekasz nie zamknięte sesje. Możesz to naprawić, wymuszając zachowanie pojedynczej sesji na wątek lub zapewniając zawsze zamknięcie sesji, na przykład ze składnią 'with'. –

Odpowiedz

48

Po utworzeniu nowej sesji w kodzie, należy ją zamknąć. Po prostu zadzwoń session.close()

Kiedy dostałem ten błąd, myślałem, że zamykam wszystkie moje sesje, ale przyjrzałem się uważnie i była jedna nowa metoda, w której nie byłem. Zamknięcie sesji w tej metodzie naprawiło ten błąd dla mnie.

+12

Czy konieczne jest zamknięcie sesji? Nie powinno być połączenie z powrotem do puli po usunięciu sesji (poza zakresem)? – mdob

+12

To jest coś, co mnie wprawiło w zakłopotanie. Dlaczego funkcja 'close()' nie jest wywoływana, gdy sesja wykracza poza zakres? – CadentOrange

+3

Należy również zamknąć sesje, gdy wystąpią wyjątki. Dokumenty sqlalchemy sugerują użycie menedżera kontekstu do radzenia sobie z tym (wśród innych rozwiązań). – whooot

11

W trybie wielowątkowego, jeśli jednoczesne żądanie num jest o wiele więcej niż rozmiar puli połączeń db, będzie rzucać limit kolejki puli rozmiar 5 przelewem 10 osiągnął error. spróbuj z tym:

engine = create_engine('mysql://', convert_unicode=True, 
pool_size=20, max_overflow=100) 

to add the pool size 

Dodaj: powyższa metoda nie jest poprawna. Rzeczywistym powodem jest to, że puli połączeń db jest zużyta i nie ma innych dostępnych połączeń. Najprawdopodobniej brakuje Ci połączenia. Na przykład:

@app.teardown_appcontext 
def shutdown_session(exception=None): 
    db_session.remove() 
+4

FYI: Dotyczy tylko kolby. – Jakobovski

Powiązane problemy