Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 24.02.2010 Ostrzeżenie: (0%)
|
Witam!
Mam taki dylemat(prawdopodobnie z powodu mojej niewiedzy): Czy w ciągu jednego przebiegu skryptu lepszym rozwiązaniem jest wywoływać funkcje mysql aby połączyć się z baza przy okazji wystąpienia każdej potrzeby pobrania/zapisu danych, a następnie połączenie zamykać - czy też uchwyt do połączenia przechować w jakiejś zmiennej(np. polu klasy)? Myślę, że pomogło by mi porównanie - proste zapytanie vs łączenie. Pozdrawiam i z góry dziękuję za odpowiedzi. Ten post edytował SpokoJny_ 27.08.2010, 18:13:31 |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 172 Pomógł: 13 Dołączył: 15.11.2009 Ostrzeżenie: (0%)
|
Najwięcej zasobów jest używanych przy połączeniu z bazą danych z tego co się orientuję, dlatego warto trzymać uchwyt.
|
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%)
|
Wygenerowanie strony to jest jedna całość, i tak należy traktować połączenie z bazą. Jest żądanie strony, zatem dla tego żądania jest ustanawiane połączenie, zapisywane do zmiennej i wykorzystywane tyle razy, ile zachodzi potrzeba.
|
|
|
|
Post
#4
|
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 4 Dołączył: 21.03.2005 Ostrzeżenie: (0%)
|
Twój pomysł jest zły. To tylko spowoduje spadek wydajności i to w każdym przypadku kiedy używasz chociaż 2 zapytań.
Najwięcej zasobów jest używanych przy połączeniu z bazą danych z tego co się orientuję, dlatego warto trzymać uchwyt. W Oraclach i innych tam wymysłach to rzeczywiście ma znaczenie. Mysql jest prostą i lekką bazą, więc tutaj nie należy sie tak przejmować podtrzymywaniem połączenia. Kilka razy spotkałem się z tak kiepskim pomysłem jak nadużywanie mysql_pconnect (persistent connection), czyli stałe połączenia. Ktoś sobie wymyślił, że oszczędzi na wydajności pozostawiając otwarte połączenia, a w efekcie wyczerpywała się cała pula dostępnych połączeń i system stawał dęba, aż do restartu bazy. |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 24.02.2010 Ostrzeżenie: (0%)
|
Gdy moja strona nie przekracza 15 klas, wtedy warto?
A np jak to jest rowiązane w większych projektach np profesjonalnych forach? TESTY PRAKTYCZNE Myślę, że najlepiej jest po prostu sprawdzić (IMG:style_emoticons/default/winksmiley.jpg) Będziemy liczyć stosunek: czas połączenia z bazą/czas wykonania zapytania. W obu przypadkach użyta jest funkcja microtime oraz round z takimi samymi parametrami, tak więc przy liczeniu stosunku nie ma to znaczenia. W bazie 'sm' znajduje się tabela 'admins': adminid(tinyint) - login(char(32)) - password(char(32)) oraz 10 rekordów ---------- Sytuacja idealna (1user) ------------ Kod ustalający ile trwa łączenie w sytuacji idealnej (1 user, serer na jednym komputerze z klientem):
Kod ustalający ile trwa czas zapytania:
Wyniki(średnia "na oko") połączenie: 0,001 zapytanie: 0,0002 połączenie/zapytania = 5 ---------- Sytuacja idealna - kod symulujący pracę między zapytaniami ---------- Kod z wieloma połączeniami
Kod z ciągłym połączeniem:
Wyniki: Ciągłe utrzymywanie w znacznej większości przypadków nieznacznie szybsze od przerywanego. Podsumowanie Ponowne łączenie kosztuje nieznaczne ilości czasu, jednak przy małych odstępach czasu między kolejnymi zapytaniami warto połączenie utrzymać. Przy dużej liczbie zapytań łączenie i zamykanie połączenia przy każdym zapytaniu jest już nieładną praktyką i nie sprzyja wydajności. Ktoś może się pokusić o przeprowadzenie innych testów, lub sprawdzenie wyników. Myślę, że mogą się nawet znacznie różnić. Wiem, że nie odkryłem tutaj ameryki, ale może ktoś wpisując w google "czy podtrzymywać połączenie z bazą" będzie miał jaśniejszy obraz sytuacji. Można też po prostu wykonać testy praktyczne swojego skryptu. Pozdrawiam - mam nadzieje, że komuś to pomogło. Ten post edytował SpokoJny_ 28.08.2010, 15:49:52 |
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%)
|
Błędne testowanie, używanie global spowalnia aplikację, global jest jak najzwyklejszy żółw.
Ten post edytował cojack 28.08.2010, 14:59:17 |
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 24.02.2010 Ostrzeżenie: (0%)
|
Bardzo dobrze, że zwróciłeś na to uwagę.
Poprawiłem kod, a także edytowałem część we wnioskach. |
|
|
|
Post
#8
|
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%)
|
Wyniku nie podałeś (IMG:style_emoticons/default/biggrin.gif)
@edit a pozatym dodaj sobie true jako argument funkcji mictrotime, będziesz miał dokładniejszy wynik. Ten post edytował cojack 28.08.2010, 17:28:10 |
|
|
|
Post
#9
|
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%)
|
Połączenie powinno być nawiązane wtedy, gdy jest wymagane (przy pierwszym zapytaniu do bazy) i ze względu na małe zużycie zasobów utrzymywane aż do zakończenia się skryptu. Pod obciążeniem przecież zapytania lecą do bazy non-stop, nie opłaca się połączenia zamykać, a w wypadku braku obciążenia w ogóle nie ma dyskusji.
Jeśli używamy nawet wielu baz mysql nie powinniśmy mieć problemu, przy innych bazach się nie wypowiem, bo np. PHP z Oraclem nie łączyłem. |
|
|
|
![]() ![]() |
|
Aktualny czas: 10.06.2026 - 10:01 |