Szukałem bardzo powolnego zapytania SQL (pochodzącego z aplikacji Java wykorzystującej Hibernate wdrożony w JBoss 5.1). To konkretne zapytanie zwróciło około 10 000 rekordów, ale nadal trwało 40 lub więcej lat.Jakieś rozwiązanie problemu niewydolności Oracle TNS (wiele obietnic, opóźnień) z aplikacji Java?
Skończyłem węszyć ruchu z bazy danych (Wireshark ma narzędzie do wykrywania TNS) i znalazł coś nieoczekiwanego. Gdy dane pochodziły z serwera, każdy wiersz wyniku znajdował się w osobnym pakiecie TNS. Ponadto każdy pakiet TNS został potwierdzony przez klienta (tj. Serwer aplikacji) przed wysłaniem następnego z bazy danych. W przypadku rekordów 10K, istnieje 10K roundtrips, aby uzyskać pakiet i potwierdzić to. Wpływ na wydajność jest ogromny.
To jest bardzo nieefektywne. TCP pozwala na większe pakiety i ma wiele mechanizmów (przesuwne okna, opóźnione ACK), aby zmniejszyć opóźnienia i zwiększyć przepustowość. Jednak w tym przypadku jest to protokół TNS, który dodaje własne negocjacje.
Jeśli uruchomię to samo zapytanie od programisty SQL Oracle, nie widzę tego wzorca. Zapytanie kończy się za około 1/10 czasu, bez tysięcy podróży w obie strony.
Krótka wersja: protokół Oracle drut (TNS) wydaje się przekazać dane w jednym pakiecie za TNS zapytania wynik rzędu i wymaga każdy pakiet ma być potwierdzony przez klienta, zanim serwer wysyła następny.
Znalazłem informacje na ten temat [tutaj] [1] (przewiń w dół do sekcji "Parametry SDU i TDU w pliku tnsnames.ora").
I tak moje pytanie: czy można kontrolować zachowanie sterownika Oracle (używam 10.2.0.4.0), aby protokół TNS był bardziej wydajny? Ponownie jest to dość standardowa aplikacja J2EE wdrożona w JBoss.
Wielkie dzięki!
Hej, dziękuję za głębokie Pytanie z pewnymi wskazówkami dla osób mających podobne sytuacje. Zagłosowano .. – TonyP