2015-05-24 16 views
5

Mam obecnie uruchomioną aplikację z MySQL w webfaction. Baza danych jest prywatna i co około 12 godzin pojawia się sporadycznie błąd "Zbyt wiele połączeń".Ciągle otrzymuję "Zbyt wiele połączeń" w Django 1.4.20

Więc zalogowany jako root w MySQL, aby sprawdzić liczbę aktywnych połączeń

mysql> show status like '%onn%'; 
+--------------------------------+-------+ 
| Variable_name     | Value | 
+--------------------------------+-------+ 
| Aborted_connects    | 4  | 
| Com_enable_governor_reconn  | 0  | 
| Com_enable_governor_reconn_lve | 0  | 
| Connections     | 12 | 
| Max_used_connections   | 1  | 
| Ssl_client_connects   | 0  | 
| Ssl_connect_renegotiates  | 0  | 
| Ssl_finished_connects   | 0  | 
| Threads_connected    | 1  | 
+--------------------------------+-------+ 

Note że Max_used_connections = 1 (??? !!!) Weird. Ok, więc może tam jest problem z procesów ...

mysql> show processlist; 
+----+------+-----------------+------+---------+------+-------+------------------+ 
| Id | User | Host   | db | Command | Time | State | Info    | 
+----+------+-----------------+------+---------+------+-------+------------------+ 
| 12 | root | localhost:38884 | NULL | Query | 0 | NULL | show processlist | 
+----+------+-----------------+------+---------+------+-------+------------------+ 
1 row in set (0.00 sec) 

lub maks połączenia jest ustawiony na niewytłumaczalnie niskiej liczbie ...

mysql> show variables like 'max_connections'; 
+-----------------+-------+ 
| Variable_name | Value | 
+-----------------+-------+ 
| max_connections | 151 | 
+-----------------+-------+ 
1 row in set (0.00 sec) 

więc zrezygnować. Wygląda to jak A) Wpadłem na jeden z tych naprawdę niejasnych błędów lub B) Potrzebuję wakacji.

Ktoś ma pomysł?

Dzięki.

EDIT: znalazłem problem

Problem był spowodowany for object in Model.object.iterator() pętli w tle uruchomiony z zadania cron. Jak się okazało, pojawił się problem z prawidłowym zamknięciem plonów i połączeń. Zmieniono to na .all() i działało to poprawnie.

Wyciągnięte wnioski: 1) unikaj używania .iterator() z zadaniami tła; 2) unikaj używania bazy danych aplikacji dla zadań wykonywanych w tle, jeśli to możliwe.

+4

odpowiedź jest zawsze ** (B) ** – rnevius

+1

plus jeden dokonywania czuję się gorzej. – misterte

+0

Czy robisz cokolwiek z 'Thread's? – rnevius

Odpowiedz

0

Czy jesteś pewien, że masz połączenie z odpowiednią bazą danych?

Ta część wydaje się nieco dziwna.

| Connections     | 12 | 

Oznacza to, że od jego uruchomienia masz tylko 12 połączeń z bazą danych. Jeśli twoja aplikacja używa tej bazy danych, ta liczba powinna być większa.

Jeśli czas pracy mysql nie jest krótszy niż sekundę, ten numer jest nieprawidłowy dla bazy danych, której używa pewna aplikacja. Jeśli uptime mysql jest tylko kilka sekund, to dane wyjściowe są bezużyteczne i musisz podać dane wyjściowe po tym, jak db zostanie użyty przez pewien czas.

Spróbuj sprawdzić ustawienia połączenia db w aplikacji.

0

Rozwiązałem ten problem, zwiększając maksymalną liczbę połączeń dozwolonych przez MySQL w moim pliku settings.py django app. Więcej informacji w MySQL docs

DATABASES = { 
    'default': { 
    'ENGINE': 'django.db.backends.mysql', 
    'NAME': '', 
    'USER': '', 
    'PASSWORD': '', 
    'HOST': 'localhost', 
    'PORT': '3306', 
    'OPTIONS': { 
      "init_command": "SET GLOBAL max_connections = 100000", #<-- The fix 
    } 
    } 
} 
+0

To tylko bandaż, a nie rozwiązanie –

Powiązane problemy