Trwałe połączenia DB-tak czy nie?

Używam warstwy PDO PHP do dostępu do danych w projekcie i czytałem o tym i widziałem, że ma dobre wrodzone wsparcie dla trwałych połączeń DB. Zastanawiam się kiedy/Czy powinienem ich użyć. Czy Mogę zobaczyć korzyści z wydajności w ciężkiej aplikacji? Czy należy wziąć pod uwagę wady, być może związane z bezpieczeństwem?

Jeśli ma to dla Ciebie znaczenie, używam MySQL 5.x.

Author: Brian Warshaw, 2008-09-08

7 answers

Możesz użyć tego jako szorstki "zestaw reguł":

Tak, Użyj trwałych połączeń, Jeśli:

  • istnieje tylko kilka aplikacji/użytkowników mających dostęp do bazy danych, tzn. nie spowoduje to 200 otwartych (ale prawdopodobnie bezczynnych) połączeń, ponieważ na tym samym hoście jest 200 różnych użytkowników.
  • baza danych jest uruchomiona na innym serwerze, do którego uzyskujesz dostęp przez sieć
  • (jedna) aplikacja uzyskuje dostęp do bazy danych bardzo często

NIE, nie używaj trwałych połączeń, Jeśli:

  • Twoja aplikacja musi uzyskać dostęp do bazy danych tylko 100 razy na godzinę.
  • masz wiele webserverów, którzy mają dostęp do jednego serwera bazy danych
  • Używasz Apache ' a w trybie prefork. Wykorzystuje jedno połączenie dla każdego procesu potomnego, które może przyspieszyć dość szybko. (via @ Powerlord w komentarzach)

Korzystanie z trwałych połączeń jest znacznie szybsze, zwłaszcza jeśli uzyskujesz dostęp do baza danych przez sieć. Nie robi to tak dużej różnicy, jeśli baza danych działa na tym samym komputerze, ale nadal jest trochę szybsza. Jednak - jak sama nazwa mówi-połączenie jest trwałe, tzn. pozostaje otwarte, nawet jeśli nie jest używane.

Problem polega na tym, że w" domyślnej konfiguracji "MySQL zezwala tylko na 1000 równoległych "otwartych kanałów". Po tym, nowe połączenia są odrzucane(można dostosować to ustawienie). Więc jeśli masz - powiedzmy-20 Webserverów z każdym 100 klientami na ich, a każdy z nich ma tylko jeden dostęp do strony na godzinę, prosta matematyka pokaże ci, że będziesz potrzebował 2000 równoległych połączeń do bazy danych. To nie zadziała.

Ergo: używaj go tylko do aplikacji z dużą ilością zapytań.

 59
Author: BlaM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 11:53:00

Krótko mówiąc, moje doświadczenie mówi, że należy unikać trwałych połączeń w miarę możliwości.

Należy zauważyć, że mysql_close jest no-operation (no-op) dla połączeń utworzonych za pomocą mysql_pconnect. Oznacza to, że stałe połączenie nie może być zamknięte przez Klienta do woli. Takie połączenie zostanie zamknięte przez serwer mysqldb, gdy nie wystąpi żadna aktywność na połączeniu przez czas dłuższy niż wait_timeout . Jeżeli wait_timeout jest dużą wartością (powiedzmy 30 min) to mysql db server może łatwo osiągnąć max_connections limit. W takim przypadku mysql db nie będzie akceptował żadnych przyszłych żądań połączenia. wtedy twój pager zaczyna piszczeć.

Aby uniknąć osiągnięcia limitu max_connections, użycie połączenia stałego wymaga starannego balansowania następujących zmiennych...

1. Number of apache processes on one host
2. Total number of hosts running apache
3. wait_timout variable in mysql db server
4. max_connections variable in mysql db server
5. Number of requests served by one apache process before it is re-spawned

Więc pl używaj stałego połączenia po dostatecznym namyśle. Możesz nie chcieć zapraszać złożonych problemów związanych z uruchomieniem, aby uzyskać niewielki zysk z trwałych połączenie.

 9
Author: LionHeart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-21 06:46:44

Tworzenie połączeń do bazy danych jest dość kosztowną operacją. Trwałe połączenia to dobry pomysł. W ASP.Net i Java world, mamy "connection pooling" , czyli mniej więcej to samo, a także dobry pomysł.

 4
Author: Josh Hinman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-08 18:03:15

IMO, prawdziwa odpowiedź na to pytanie jest to, co działa najlepiej dla Ciebie aplikacji. Polecam testowanie aplikacji przy użyciu zarówno trwałych, jak i nietrwałych połączeń.

Maggie Nelson @ obiektywnie zorientowana napisała o tym w sierpniu, a Robert Swarthout napisał towarzyszący post z pewnymi trudnymi liczbami. Obie są całkiem dobre.

 3
Author: Mike H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-08 18:16:39

Moim skromnym zdaniem:

Podczas korzystania z PHP do tworzenia stron internetowych, większość Twojego połączenia będzie "żyć"tylko przez cały okres działania strony. Trwałe połączenie będzie cię kosztować dużo kosztów ogólnych, ponieważ będziesz musiał umieścić je w sesji lub czymś takim.

W 99% przypadków pojedyncze nie utrzymujące się połączenie, które umiera na końcu wykonania strony, będzie działać dobrze.

Pozostałe 1% czasu, prawdopodobnie nie powinieneś używać PHP dla aplikacji, a tam nie jest idealnym rozwiązaniem dla Ciebie.

 0
Author: Markus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-09 13:34:55

Zamierzałem zadać to samo pytanie, ale zamiast zadać to samo pytanie ponownie dodam tylko kilka informacji, które znalazłem.

Warto również zauważyć, że nowsze rozszerzenie mysqli nie zawiera nawet opcji używania trwałych połączeń z bazą danych.

W tej chwili nadal używam stałych połączeń, ale planuję przełączyć się na nietrwały w niedalekiej przyszłości.

 0
Author: ejunker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-10 19:06:22

Ogólnie rzecz biorąc, musisz czasami używać Połączeń nietrwałych i dobrze jest mieć jeden wzór do zastosowania przy projektowaniu połączeń db (o ile używanie połączeń trwałych w Twoim kontekście jest stosunkowo niewielkie.)

 0
Author: dkretz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-10 19:09:27