2012-04-03 12 views
8

Czytałem o puli połączeń SQLAlchemy, która ma domyślnie 5 połączeń i domyślnie przepełnienie do 10.Co się stanie, gdy pula połączeń zostanie wyczerpana?

Jeśli liczba buforowanych połączeń jest przekroczona, co się dzieje? Czy kolejne żądania są kolejkowane do momentu udostępnienia darmowego połączenia lub czy zostanie utworzone nowe połączenie, które nie wchodzi do puli?

Co się dzieje z nieużywanymi połączeniami, gdy pula została "przepełniona" do domyślnej wartości maksymalnej wynoszącej 10? Czy te połączenia rozłączają się po czasie domyślnym (jak w przypadku standardowej puli), czy są wydawane bardziej agresywnie niż standardowa pula?

Odpowiedz

13

Czytasz o QueuePool, który zarządza połączeniami z bazą danych dla lepszej wydajności. Czyni to poprzez utrzymywanie otwartych bezczynnych połączeń, na wypadek gdybyś chciał ich później użyć. Liczba otwartych połączeń to pool_size = 5 (domyślnie). Jeśli otworzysz szóste połączenie, jedno z połączeń w kolejce zostanie zamknięte, o ile jest bezczynne. Jeśli żadna nie jest bezczynna, QueuePool otworzy dodatkowe, do max_overflow = 10 (domyślnie). Dosyć więcej, a otrzymasz błąd. Jednak oba te parametry można konfigurować. Ustaw pool_size = 0, aby mieć nieograniczone otwarte połączenia. The source is here

+0

pool_size = -1 dla nieograniczonej liczby. – zzzeek

+1

hmm, w linku do dokumentów, spójrz na QueuePool .__ init__, docstring mówi "' 'pool_size'' może być ustawione na 0, aby wskazać brak limitu rozmiaru" –

+0

oh masz rację szukałem w pool_recycle – zzzeek

4

Per SQLAlchemy docs,

Gdy liczba wyewidencjonowanym połączeń osiągnie wymiar ustalony w pool_size, zostaną zwrócone do tego limitu dodatkowe połączenia. Po zwrocie tych dodatkowych połączeń do puli są one odłączane i odrzucane. Wynika z tego, że całkowita liczba jednoczesnych połączeń, na które zezwala pula, to pool_size + max_overflow, a całkowita liczba połączeń "uśpionych" dozwolonych przez pulę to pool_size.

Tak, przepełnione połączenia są uwalniane bardziej agresywnie niż zwykle połączenia spania.

Jeśli rzeczywiście spojrzeć na źródła QueuePool._do_get(), widać, że podnosi TimeoutError gdy liczba połączeń równa wielkości puli + przepełnienie i brak połączenia jest zwracana z powrotem do puli wkrótce po connect() nazywa.

Powiązane problemy