Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wydajność sterownika XA w porównaniu ze sterownikiem JDBC innym niż XA?

Podobnie jak w przypadku wszystkich rzeczy związanych z wydajnością, odpowiedź brzmi:to zależy. W szczególności zależy to od tego, jak dokładnie używasz sterownika.

Koszt transakcyjnej interakcji z bazą danych dzieli się z grubsza na:koszty związane ze złożonością kodu, koszty komunikacji, przetwarzanie sql i dyskowe operacje wejścia/wyjścia.

Narzut komunikacji różni się nieco między przypadkami XA i innymi niż XA. Wszystko inne jest równe, transakcja XA wiąże się tutaj z nieco wyższym kosztem, ponieważ wymaga więcej podróży w obie strony do bazy danych. W przypadku transakcji innej niż XA w trybie ręcznego zatwierdzania koszt to co najmniej dwa wywołania:operacja(e) sql i zatwierdzenie. W przypadku XA jest to start, operacja(e) sql, zakończenie, przygotowanie i zatwierdzenie. Dla konkretnego przypadku użycia, który automatycznie zoptymalizuje, aby rozpocząć, operacje sql, zakończyć, przygotować. Nie wszystkie połączenia mają taki sam koszt:dane przeniesione w zestawie wyników zwykle będą dominować. W sieci LAN koszt dodatkowych podróży w obie strony zwykle nie jest znaczący.

Zwróć jednak uwagę, że na nieostrożnych czają się kilka interesujących pułapek. Na przykład niektóre sterowniki nie obsługują buforowania przygotowanych instrukcji w trybie XA, co oznacza, że ​​użycie XA wiąże się z dodatkowym obciążeniem polegającym na ponownej analizie SQL przy każdym wywołaniu lub wymaga użycia oddzielnej puli instrukcji na górze sterownika. Jeśli chodzi o pule, prawidłowe tworzenie puli połączeń XA jest nieco bardziej skomplikowane niż pule połączeń innych niż XA, więc w zależności od implementacji puli połączeń możesz również zauważyć niewielki problem. Niektóre struktury ORM są szczególnie podatne na obciążenie puli połączeń, jeśli używają agresywnego zwalniania połączeń i ponownie nabywają dane w zakresie transakcji. Jeśli to możliwe, skonfiguruj tak, aby przechwytywać i utrzymywać połączenie przez cały okres istnienia tx, zamiast wielokrotnie trafiać do puli.

Z zastrzeżeniem wspomnianym wcześniej, dotyczącym buforowania przygotowanych instrukcji, nie ma istotnej różnicy w koszcie obsługi sql między tx XA i innym niż XA. Istnieje jednak niewielka różnica w zużyciu zasobów na serwerze db:w niektórych przypadkach serwer może zwolnić zasoby wcześniej w przypadku innym niż XA. Jednak transakcje są zwykle na tyle krótkie, że nie ma to większego znaczenia.

Teraz rozważymy obciążenie dysku we/wy. Tutaj zajmujemy się I/O wywołanymi protokołem XA, a nie SQL używanym w logice biznesowej, ponieważ ten ostatni pozostaje niezmieniony w obu przypadkach. W przypadku transakcji tylko do odczytu sytuacja jest prosta:rozsądny menedżer db i tx nie wykonuje żadnych zapisów dziennika, więc nie ma narzutu. W przypadku zapisu to samo dotyczy sytuacji, gdy db jest jedynym zaangażowanym zasobem, ze względu na optymalizację zatwierdzania jednofazowego XA. W przypadku 2PC każdy serwer db lub inny menedżer zasobów potrzebuje dwóch zapisów na dysku zamiast tego używanego w przypadkach innych niż XA, a menedżer tx również potrzebuje dwóch. Dzięki powolności pamięci dyskowej jest to dominujące źródło narzutu wydajności w XA w porównaniu z innymi niż XA.

Kilka akapitów wstecz wspomniałem o złożoności kodu. XA wymaga nieco więcej wykonywania kodu niż inne niż XA. W większości przypadków złożoność tkwi w menedżerze transakcji, chociaż oczywiście możesz bezpośrednio sterować XA, jeśli wolisz. Koszt jest w większości trywialny, z zastrzeżeniem wspomnianych już zastrzeżeń. Chyba że używasz szczególnie słabego menedżera transakcji, w którym to przypadku możesz mieć problem. Szczególnie interesujący jest przypadek tylko do odczytu — dostawcy menedżerów transakcji zwykle wkładają swoje wysiłki w optymalizację kodu we/wy dysku, podczas gdy rywalizacja o blokadę jest poważniejszym problemem w przypadkach użycia tylko do odczytu, szczególnie w systemach o dużej współbieżności.

Należy również zauważyć, że złożoność kodu w menedżerze tx jest czymś w rodzaju czerwonego śledzia w architekturach zawierających serwer aplikacji lub innego standardowego dostawcę menedżera transakcji, ponieważ zwykle używają one tego samego kodu do koordynacji transakcji XA i innych niż XA. W przypadkach innych niż XA, aby całkowicie pominąć menedżera tx, zazwyczaj musisz powiedzieć serwerowi aplikacji / frameworkowi, aby traktował połączenie jako nietransakcyjne, a następnie przeprowadzić zatwierdzenie bezpośrednio za pomocą JDBC.

Więc podsumowanie to:Koszt zapytań sql zdominuje czas transakcji tylko do odczytu, niezależnie od wyboru XA/nie XA , chyba że zepsujesz coś w konfiguracji lub nie wykonasz szczególnie trywialnych operacji sql w każdym tx, to ostatnie jest znakiem, że twoja logika biznesowa może prawdopodobnie użyć pewnej restrukturyzacji, aby zmienić stosunek kosztów zarządzania tx do logiki biznesowej w każdym tx.

W przypadkach tylko do odczytu obowiązuje więc zwykła rada dotycząca niezależnego od protokołu transakcji:rozważ pamięć podręczną drugiego poziomu poziomu obsługującą transakcje w rozwiązaniu ORM, zamiast uderzać za każdym razem w DB. Jeśli to się nie uda, dostrój sql, a następnie zwiększ bufor bufora bazy danych, aż zobaczysz 90%+ współczynnik trafień lub maksymalizujesz gniazda pamięci RAM serwera, w zależności od tego, co nastąpi wcześniej. Tylko martw się o XA i inne niż XA, gdy już to zrobisz i stwierdzisz, że wszystko jest nadal zbyt wolne.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego otrzymuję błąd składni podczas używania CAST w MySQL?

  2. Wybierz i wyświetl tylko zduplikowane rekordy w MySQL

  3. Instalujesz PostGresQL i MySQL w Mac OS X z systemem MAMP?

  4. Projekt bazy danych aplikacji społecznościowych:jak mogę ulepszyć ten schemat?

  5. Długość indeksu varchar MySQL