Trwałe połączenie z bazą

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
JaroW
Posty: 5
Rejestracja: wt paź 05, 2004 9:28 am
Lokalizacja: Łódź

Trwałe połączenie z bazą

Post autor: JaroW »

Używając funkcji mysql_pconnect tworzymy tzw. trałe połączenie z bazą. W jaki sposób je zamknąć? Funkcja mysql_close tego nie robi. Serwer bazodanowy cały czas przechowuje otwarte połączenia i w końcu się zatyka.
iro
Moderator
Posty: 402
Rejestracja: pt gru 19, 2003 8:20 pm
Lokalizacja: Szczecin

Re: Trwałe połączenie z bazą

Post autor: iro »

W manualu nie ma nic na temat zamykania połączenia nawiązywanego za pomocą tej funkcji (oprócz tego, że mysql_close() tego nie robi :)). Proponuję zrezygnować ze stałego połączenia z bazą danych, gdyż możesz mieć ograniczenie w postaci maxymalnej liczby nawiązanych połączeń. Właśnie to jest powodem zatykania się serwera.
JaroW
Posty: 5
Rejestracja: wt paź 05, 2004 9:28 am
Lokalizacja: Łódź

Re: Trwałe połączenie z bazą

Post autor: JaroW »

Można by spytać po co w takim razie jest funkcja mysql_pconnect() i kiedy połączenie ustanowione za jej pomocą jest zamykane?
Stig
Administrator
Posty: 938
Rejestracja: pn paź 04, 2004 10:52 am

Re: Trwałe połączenie z bazą

Post autor: Stig »

JaroW pisze:Można by spytać po co w takim razie jest funkcja mysql_pconnect() i kiedy połączenie ustanowione za jej pomocą jest zamykane?
Funkcja ta powstała po to, aby ograniczyć zaangażowanie części dostępnych zasobów i czasu, potrzebnych na połączenie za pomocą zwykłej funkcji mysql_connect(). I to właściwie jest jej jedyna zaleta. Jeśli chodzi o zamykanie tej funkcji to nic na ten temat nie wiem. Prawdobodonie połączenie nigdy nie zostanie zerwane, a przy ponownym wywołaniu tej funkcji, funkcja ta sprawdzi czy połączenie już istenieje i wykorzysta to istniejące połączenie.

W praktyce funkcja mysql_pconnect() jest nie najlepszym rozwiązaniem.
Michał Fikus
Przelotem
Przelotem
Posty: 242
Rejestracja: sob cze 08, 2002 6:39 pm
Lokalizacja: Wejherowo

Re: Trwałe połączenie z bazą

Post autor: Michał Fikus »

Sam też dokładnie nie wiem - proponuję spytać na php.pl.
Mi się wydaje, że w ustawieniach serwera jest to definiowane.

Stig -> nie jest to najlepsze rozwiązanie... zależy od wykorzystania. To, że np. w Twoim serwisie nie potrzebujesz robić oszczędności użycia zasobów serwera, nie znaczy, że jest to mało przydatne (tzn. nie najlpesze rozwiązanie :P).
Stig
Administrator
Posty: 938
Rejestracja: pn paź 04, 2004 10:52 am

Re: Trwałe połączenie z bazą

Post autor: Stig »

Michał Fikus pisze:Stig -> nie jest to najlepsze rozwiązanie... zależy od wykorzystania. To, że np. w Twoim serwisie nie potrzebujesz robić oszczędności użycia zasobów serwera, nie znaczy, że jest to mało przydatne (tzn. nie najlpesze rozwiązanie :P).
Fakt, to zależy wszystko od wykorzystania, ale należy się zastanowić, czy jest sens oszczędzać użycie zasobów serwera kosztem tworzenia wielu połączeń i w efekcie jego zapchaniem. Oczywiście, w niektórych przypadkach funkcja mysql_pconnect() jest lepsza niż mysql_connect() (w końcu w jakimś celu została stworzona), ale tych przypadków jest (tak mi się wydaje) niewiele. Aby efektywnie używać funkcji mysql_pconnect() trzeba mieć dostęp do ustawień serwera (żeby móc je dostosować do własnych potrzeb). Poza tym znaczące różnice w wykorzystaniu obu funkcji widać, zapewne, dopiero przy bardzo zaawansowanych projektach. W takim wypadku lepiej chyba stosować funkcję mysql_connect(), która jest poprostu popularniejsza :) Ja bynajmniej ją stosuję i nie mam zamiar się przesiadać :lol:
Michał Fikus
Przelotem
Przelotem
Posty: 242
Rejestracja: sob cze 08, 2002 6:39 pm
Lokalizacja: Wejherowo

Re: Trwałe połączenie z bazą

Post autor: Michał Fikus »

Różnica jest odczuwalna nie tyle w zależności od zaawansowania projektu (mogą być duże operacje, ale to nie wpływa na ilość pobieranych danych w mySQL-u itp.) ale od częstotliwości nawiązywania połączenia - czyli częstotliwość wykonywania skryptów operujących na bazie danych. Dlatego jest tu oszczędność na nie otwieraniu po raz n-ty połączenia.
wixor
Przelotem
Przelotem
Posty: 336
Rejestracja: śr gru 31, 2003 10:18 pm
Lokalizacja: Wrocław

Re: Trwałe połączenie z bazą

Post autor: wixor »

coś tu si pomieszało - serwer się zapycha gdy używa się zwykłego connecta - podczas wykonywania wielu skryptów jednocześnie nawiązuje się wiele połączeń (wbrew pozorom, bardzo złożona operacja), a połączenia trwałe pozwalają na współużytkowanie jednego połączenie pezez wiele skryptów wykonujących się jednocześnie.
Marim
Posty: 13
Rejestracja: sob mar 06, 2004 7:01 pm
Lokalizacja: Kraków

Re: Trwałe połączenie z bazą

Post autor: Marim »

Według mnie dla bardziej rozbudowanych serwisów w których są skrypty wykorzystujace duza ilosc polaczen do bazy, badz duza ilosc odwiedzajacych (przez caly czas z serwisu korzysta przynajmniej 1 osoba) o wiele bardziej oplaca sie uzywac funckji mysql_pconnect().

Przede wszystkim była mowa o zatykaniu serwera poprzez zbyt duza ilosc polaczen. Ale chyba tu jest jakas pomylka poniewaz jak sie uruchamia tzw. "stale polaczenie" to juz drugiego polaczenia sie nie uzywa. Tzn jest zawsze 1 i tylko 1 polaczenie do bazy. Serwer i baza na tym duzo zyskuja poniewaz to co naprawde obciaza bazy to sa wlasnie ciagle polaczenia do niej.
JaroW
Posty: 5
Rejestracja: wt paź 05, 2004 9:28 am
Lokalizacja: Łódź

Re: Trwałe połączenie z bazą

Post autor: JaroW »

... jak sie uruchamia tzw. "stale polaczenie" to juz drugiego polaczenia sie nie uzywa. Tzn jest zawsze 1 i tylko 1 polaczenie do bazy...
U mnie z trwałego połączenia korzysta tylko skrypt w którym zostało utworzone. Każdy następny skrypt otwiera kolejne połączenie.
Może w takim razie jest gdzieś błąd przy nawiązywaniu trwałego połączenia? Każdy skrypt na początku tworzy obiekt połączenia z bazą (wykorzystując mysql_pconnect()). Z tego obiektu korzystam przy wszystkich odwołaniach do bazy. Każdy następny sktypt tworzy następny obiekt itd. Może w tym rozwiązaniu tkwi problem?
Stig
Administrator
Posty: 938
Rejestracja: pn paź 04, 2004 10:52 am

Re: Trwałe połączenie z bazą

Post autor: Stig »

Zgadza się, że za funkcja mysql_pconnect() tworzy tylko jedno połączenie. W przypadku jej ponownego wykorzystania sprawdza czy dane połączenie już istnieje. Jeżeli tak to korzysta z niego, jeżeli nie to je tworzy (może stworzyć je tylko raz). Problem z zapychaniem serwera przez trwałe połączenia może mieć takie podłoże: jeżeli używamy połączeń stałych, a niemal każdy skrypt wymaga dostępu do bazy, wskazane jest otwieranie stałego połączenia dla każdego procesu wykonywanego przez serwer. W tym wypadku należy odpowiednio dostosować ilość istniejących połączeń na jaką zezwala serwer (np. Apache standardowo 150) i baza MySQL (standardowo 100). Jeżeli zostaną one pozostawione na podstawowym poziomie, a nastąpi duże obciążenie systemu, mogą one nie wystarczyć do obsłużenia wszystkich żądań dostępu. Należy więc dopasować oba parametry tak, aby każdy proces serwera www miał możliwość otwarcia połączenia z bazą, a zasoby sprzętowe nie zostały przekoroczone.
Michał Fikus
Przelotem
Przelotem
Posty: 242
Rejestracja: sob cze 08, 2002 6:39 pm
Lokalizacja: Wejherowo

Re: Trwałe połączenie z bazą

Post autor: Michał Fikus »

wixor -> nie pomieszało mi się, tylko źle mnie zrozumiałeś. Mówiłem o tym, że gdy używamy twardego połączenia z bazą, oszczędzamy na użyciu zasobów sprzętowych potrzebnych do wielokrotnego nawiązywanie połączeń miękkich.
serwer się zapycha gdy używa się zwykłego connecta - podczas wykonywania wielu skryptów jednocześnie nawiązuje się wiele połączeń
z tym całkowicie się zgadzam. Może jasno się nie wyraziłem, w takim razie przepraszam.
wixor
Przelotem
Przelotem
Posty: 336
Rejestracja: śr gru 31, 2003 10:18 pm
Lokalizacja: Wrocław

Re: Trwałe połączenie z bazą

Post autor: wixor »

ten post był odpowiedzią na post iro:
Proponuję zrezygnować ze stałego połączenia z bazą danych, gdyż możesz mieć ograniczenie w postaci maxymalnej liczby nawiązanych połączeń. Właśnie to jest powodem zatykania się serwera.
the_foe
Przelotem
Przelotem
Posty: 295
Rejestracja: pt sty 31, 2003 12:53 pm
Lokalizacja: Wałbrzych
Kontakt:

Re: Trwałe połączenie z bazą

Post autor: the_foe »

generalnie, stale polaczenie z baza (al quaida :P ) przydaje sie wtedy, kiedy mamy bardzo popularny serwis (cos na miare onet.pl :lol: )
Sprawa jest prosta: przy niewielu userach nie oplaca nam sie otwirac stalego polaczenia, bo sa duze "dziury" - czasy, kiedy serwer nie pracuje. W przypadku mocno odwiedzanych stron "koszt" polaczenia z baza jest wysoki, bo w tym samym czasie moze sie podlaczyc jeden user. Inaczej mowiac stoja w kolejce. Kiedy na raz chce otworzyc strone, wykorzystujaca niestale polaczenia z baza, 5-20 userow nie ma kloptu, ale jak to sa tysiace jak w przypadku onet.pl to zaczyna sie robic nieciekawie. stale polaczenia raz zalozone nie umieraja i kiedy przegladamy kolejne podstrony serwer wykorzystuje wczesniej zainicjowane polaczenie - nie jestemsy ciezarem dla serwera.
Jednak uwierzcie - nikomu tu nie jest to polaczenie potrzebne. W naszym przypadku zwykle polaczenie jest lepsze, tym bardziej ze nikt z nas nie posiada (chyba) serwera bez limitu, lub z wysokim, limitem jednoczesnych polaczen z baza.
Inna kwestia, ze wykorzystywanie stalego polaczenia, w polaczeniu z wadliwym skryptym moze doprowadzic do zawieszenia serwera! W przypadku zwyklego polaczenia nam to nie grozi, bo polaczenie jest automatycznie zrywane po zakonczeniu skryptu (zawsze mnie ciawilo po co wiec jest funkcja [manual]mysql_close[/manual] :twisted: )
Ostatnio zmieniony pt paź 08, 2004 1:23 am przez the_foe, łącznie zmieniany 1 raz.
the_foe
Przelotem
Przelotem
Posty: 295
Rejestracja: pt sty 31, 2003 12:53 pm
Lokalizacja: Wałbrzych
Kontakt:

Re: Trwałe połączenie z bazą

Post autor: the_foe »

wixor pisze:coś tu si pomieszało - serwer się zapycha gdy używa się zwykłego connecta - podczas wykonywania wielu skryptów jednocześnie nawiązuje się wiele połączeń (wbrew pozorom, bardzo złożona operacja), a połączenia trwałe pozwalają na współużytkowanie jednego połączenie pezez wiele skryptów wykonujących się jednocześnie.
jedyna roznica miedzy zwyklym a stalym polaczeniem jest to, ze to drugie nei jest zrywane p ozakonczeniu skryptu. Widze ze podejrzewasz ze nasz Indianin to potrafi, niestety, aby miec wielowatkowy serwer trzeba by zainstalowac PHP pod IIS albo FastTrack.
Apache potrafi tylko obsluzyc wieloprocesorowo polaczenie host-klient, nei daje rady wykorzystac watkow ustanowionych z innym klientem, a ktore sa tozsame z requestem danego usera.
ODPOWIEDZ