Jak hibernacja prawie zrujnowała moją karierę?

Opublikowany: 2022-03-11

Wyobraź sobie, że jesteś programistą Java i masz zamiar rozpocząć kolejny duży projekt. Musisz podjąć fundamentalne decyzje, które zostaną z Tobą przez resztę projektu. Chcesz wybrać najlepszą abstrakcję obiektową z elastycznego modelu danych, ponieważ nie chcesz zajmować się zwykłym SQL. Chcesz obsługiwać wszystkie rodzaje danych, a najlepiej obsługiwać wszystkie rodzaje baz danych.

Oczywistą odpowiedzią jest po prostu użycie Hibernate , prawda? 90% programistów Java zgodziłoby się z tobą, ale czy to jest słuszna decyzja?

Rzućmy okiem na to, co może pójść nie tak, jeśli na ślepo użyjesz Hibernate tylko dlatego, że jest to przyjęty standard.

Weźmy pod uwagę Monikę, programistkę Java. Monica niedawno awansowała na stanowisko architekta i jest teraz odpowiedzialna za układanie stosu technologicznego dla nowego produktu w swojej firmie. Wie, że w świecie Javy istnieje tylko jedno dobre narzędzie do obsługi komunikacji z bazami danych: Hibernate . Hibernate to dobrze znany i obsługiwany standard JPA. Jednak zawsze warto sprawdzić kilka rzeczy przed rozpoczęciem projektu. Na szczęście jej kolega, Ben, zna właściwego faceta.

Hibernacja brzmi jak srebrna kula

4 lata temu

Ben : Witaj Monica, chciałbym przedstawić Johna. Jest ekspertem od Hibernacji i pomoże ci.

Monica : Hej John, cieszę się, że znalazłeś dla mnie trochę czasu. Tak więc budujemy naszą następną wielką rzecz, wiesz. Planujemy zostać kolejnym Facebookiem lub Google. Pracowite dni. Będzie ogromny. Absolutnie fantastyczny! Wszyscy są tak podekscytowani! Awansowałem na stanowisko architekta, więc teraz muszę wybrać stos, którego będziemy używać. Brakuje tylko wytrwałości…

Jan - Hibernacja !

Monica : Tak! Dokładnie tak! Właśnie o tym myślałem! Wydaje się, że to dla nas idealne dopasowanie i prawdziwa okazja. Prawdziwe rozwiązanie korporacyjne dla prawdziwego problemu korporacyjnego, sprawdzone na rynku i z długą historią. Słyszałem z nim tyle pozytywnych doświadczeń. Mam jednak problem z jednym z naszych kolegów z drużyny; jest temu całkowicie przeciwny. Zna się na bazach danych i boi się dodawania kolejnej warstwy między naszą aplikacją a bazą danych. Jest super bystry i potrzebuję naprawdę dobrych argumentów, aby przekonać go, że to dobra decyzja. Czy możesz mi z tym pomóc?

John : Oczywiście! Będę zadowolony gdy. Hibernate jest rzeczywiście znakomitym narzędziem. Jest szeroko stosowany w dużych, prawdziwych rozwiązaniach korporacyjnych, takich jak banki. Nie możesz się z tym pomylić. Pomyśl o wytrwałości: Wybierz Hibernacja . Jeśli piszesz w Javie, jest to absolutnie właściwy wybór, a ponadto masz porty dla innych języków. Zobacz, ile opisów stanowisk tego wymaga!

Monica : Absolutnie się zgadzam! Mam takie same odczucia. W poprzednim projekcie używaliśmy głównie SQL za pośrednictwem zwykłego starego JDBC. Niedorzeczny! Wiem! Ale o to chodzi: mamy w zespole naprawdę mądrych ludzi od SQL i kiedy zobaczyli SQL wygenerowany przez Hibernate , zdenerwowali się. Wydawał się brzydki i nieczytelny; czy będzie to problem w przyszłości?

John - Spójrz. DBA mają inną perspektywę. Boją się Hibernate , ponieważ wydaje się, że zastępuje ich rolę w projekcie. Co więcej, bazy danych mają wbudowane optymalizatory zapytań, więc nie musisz się martwić, jak te zapytania będą faktycznie wyglądać. Baza danych zoptymalizuje to za Ciebie. Wszystko sprowadza się do szybkiego rozwoju, czego SQL nie jest w stanie zrobić.

Monica : Naprawdę?! Nie masz już do czynienia z SQL? Niesamowity! Ostatnim razem DBA spędził tygodnie próbując zoptymalizować niektóre zapytania. Tygodnie! Och, czuję się tak zakłopotany, mówiąc ci to, ale czy wiedziałeś, że używamy… procedur przechowywanych (śmiech). Och, to był taki bałagan. Czy możesz uwierzyć, że projekt nadal go używa? Tak mi żal ludzi. Wciąż muszą pisać ten żmudny kod w kółko. Zastanawiam się, czy to nadal projekt Java lub SQL?

John - To jest dokładnie różnica między podejściem zorientowanym obiektowo a relacyjnym. Jest to tak zwane niedopasowanie impedancji obiektowej. Hibernacja może wypełnić tę lukę. Deweloperzy mogą skupić się na budowaniu logiki biznesowej. Funkcje push uszczęśliwiają interesariuszy i całe kierownictwo. Rób to, co najważniejsze: Biznes! Zniknie wiele wzorcowego kodu, a będziesz miał magiczne, niewidzialne, ale niezawodne połączenie między logiką a danymi.

Monica - Wzajemna współpraca. Pełna synergia. Jakby baza danych była częścią języka od samego początku. Tak się cieszę, że mogę być liderem tego technologicznego skoku wiary. To jak prędkość warp w wędrówce z oprogramowaniem.

John - Tak! Masz to!

Monica : O rany, jestem taka podekscytowana! Dziękuję, John! Jestem gotowy!

Hibernate nie jest srebrną kulą. Nie traktuj tego jako domyślnego rozwiązania bazy danych.
Ćwierkać

Rosnące bóle dzięki nieelastycznym rozwiązaniom

3 lata temu

Monica : Hej John, pamiętasz projekt, o którym rozmawialiśmy w zeszłym roku?

John - Jasne. Jak leci?

Monica - Niedługo idziemy do produkcji. Wszystko jest w porządku, ale pojawiło się kilka pytań.

John - Jasne, uderz mnie.

Monica - Cóż, nie możemy już generować schematu naszej bazy danych od zera. Jaki jest najlepszy sposób obsługi zmian schematu bez utraty danych?

John — Po pierwsze, Hibernate nie jest przeznaczony do użycia jako narzędzie do migracji produkcyjnej. Użyj czegoś takiego jak FlywayDB lub Liquibase. To całkiem proste. Zapisujesz skrypty migracji, a następnie aktualizujesz model encji wraz z mapowaniami Hibernate , aby był zsynchronizowany z rzeczywistą strukturą bazy danych.

Monica : Hmm, rozumiem. W poprzednim projekcie używaliśmy po prostu migracji zwykłego SQL.

John : To też w porządku. Tak długo, jak zachowujesz synchronizację modelu jednostki i schematu, rób to tak, jak chcesz.

Monica - rozumiem. Jest jeszcze jedna rzecz. Zawsze borykamy się z leniwymi/gorliwymi problemami z pobieraniem. W pewnym momencie postanowiliśmy zrobić wszystko z zapałem, ale wydaje się to nieoptymalne, a poza tym czasami nie ma dostępu do niektórych pól, bo nie ma sesji, czy coś w tym stylu. Czy to normalne?

John — musisz dowiedzieć się więcej o hibernacji . Mapowanie z bazy danych nie jest proste. Zasadniczo można to zrobić na wiele sposobów. Musisz tylko wybrać sposób, który Ci odpowiada. Pobieranie z opóźnieniem umożliwia ładowanie tych obiektów na żądanie, ale musisz działać w ramach aktywnej sesji.

Monica — wciąż walczymy z wyborem silnika bazy danych do ostatecznego wdrożenia. Myślałem, że Hibernate jest przenośny, ale mamy kilka natywnych zapytań, które wykorzystują trochę magii MS SQL, a my naprawdę chcielibyśmy skorzystać z MySQL w produkcji.

John - Hibernate zapewnia elastyczność, o ile używasz kryteriów odłączonych lub HQL; wszelkie zapytania natywne po prostu powiążą Twoje rozwiązanie z bazą danych.

Monica : Wygląda na to, że musimy wtedy trzymać się MS SQL. Ostatnie pytanie: Mój kolega z drużyny powiedział, że w HQL nie ma słowa kluczowego „limit”. Myślałem, że żartuje, ale też nie mogłem tego znaleźć. Przepraszam za głupie pytanie…

John - Rzeczywiście, w HQL nie ma słowa kluczowego „limit”. Możesz to kontrolować za pomocą obiektu zapytania, ponieważ jest on specyficzny dla dostawcy bazy danych.

Monica : Wydaje się dziwne, że wszystkie inne elementy są w HQL. Nic nie szkodzi. Dziękuję za Twój czas!

Powiązane: Jak zbudować aplikację wielodostępną: samouczek dotyczący hibernacji

Teraz ponownie hackujemy razem rozwiązania w SQL

2 lata temu

Monica - John, na początku nie mieliśmy zamiaru zajmować się SQL, ale teraz wygląda na to, że musimy. Nasze potrzeby rosną i wydaje się, że nie da się tego obejść. Czuję się źle, ale ponownie zaczęliśmy używać SQL na co dzień.

John : Cóż, to nie jest złe. Na samym początku nie musiałeś skupiać się na bazie danych. Jednak wraz z rozwojem projektu dobrze jest używać SQL i pracować nad optymalizacją wydajności.

Monica - Czasami spędzamy dni na szukaniu błędów. Wygląda na to, że musimy przeanalizować kod SQL generowany przez Hibernate , ponieważ nie mamy pojęcia, dlaczego nie działa on zgodnie z oczekiwaniami i daje nieoczekiwane wyniki. Natrafiliśmy na pewne problemy, które są dobrze znane w narzędziu do śledzenia błędów Hibernate . Ponadto trudno jest napisać prawidłowe migracje przy jednoczesnym zachowaniu synchronizacji modelu encji. Jest to czasochłonne, ponieważ musimy się wiele nauczyć o wewnętrznych funkcjach Hibernate i przewidzieć, jak będzie działać.

John : Zawsze jest krzywa uczenia się. Nie musisz dużo pisać, ale musisz wiedzieć, jak to działa.

Monica - Praca z większymi zbiorami danych też jest denerwująca. Ostatnio dokonaliśmy ogromnego importu do bazy danych i było to boleśnie powolne. Potem dowiedzieliśmy się, że musimy wyczyścić sesję, aby przyspieszyć. Mimo to nadal jest znacznie wolniejszy, więc postanowiliśmy przepisać go jako zwykłe instrukcje SQL. Zabawne jest to, że pisanie zwykłego SQL było najszybszym sposobem na zrobienie tego, więc zdecydowaliśmy się zrobić to jako naszą ostatnią opcję.

John — Import nie jest procesem zorientowanym obiektowo. Hibernate koncentruje się na projektowaniu zorientowanym obiektowo. Pamiętaj, że zawsze możesz użyć zapytań natywnych.

Monica - Czy możesz mi pomóc zrozumieć, jak działa pamięć podręczna Hibernate ? Po prostu tego nie rozumiem. Istnieje kilka skrzynek pierwszego/drugiego poziomu. O co w tym wszystkim chodzi?

John - Jasne. Jest to tak zwana pamięć podręczna trwałych danych na poziomie transakcji. Możliwe jest skonfigurowanie pamięci podręcznej na poziomie klastra lub maszyny JVM na podstawie klasy po klasie i kolekcji po kolekcji. Możesz nawet podłączyć klastrowaną pamięć podręczną. Pamiętaj jednak, że pamięci podręczne nie są świadome żadnych zmian wprowadzonych do magazynu trwałego przez inną aplikację. Można je jednak skonfigurować tak, aby regularnie usuwały wygasłe dane z pamięci podręcznej.

Monica : Przepraszam, myślę, że mam zły dzień. Czy możesz to wyjaśnić nieco więcej?

John - Jasne. Za każdym razem, gdy przekazujesz obiekt do save , update , saveOrUpdate lub pobrania go przez load , get , list , iterate lub scroll , obiekt ten jest dodawany do wewnętrznej pamięci podręcznej sesji. Możesz także usunąć obiekt i jego kolekcje z pamięci podręcznej pierwszego poziomu.

Monika - E…

John - Dodatkowo możesz kontrolować tryby pamięci podręcznej. Możesz używać trybu normal do odczytywania i zapisywania elementów w pamięci podręcznej drugiego poziomu. Użyj trybu get , aby czytać od drugiego poziomu, ale nie możesz odpisać. Użyj put , co jest tym samym co get , ale nie możesz czytać z drugiego poziomu. Można również użyć trybu refresh , który będzie zapisywał do drugiego poziomu, ale nie odczytywał z niego i pomijał właściwość use minimal puts , wymuszając odświeżenie cache drugiego poziomu dla wszystkich elementów odczytanych z bazy danych.

Monica - rozumiem. Dobrze. Niech pomyślę o tym. Och, jest późno, muszę iść. Dziękuję za Twój czas!

John - Nie ma za co!

Rezygnacja z hibernacji

2 tygodnie temu

Monica - John, myślałem, że wkraczamy w nową erę tworzenia oprogramowania. Myślałem, że robimy skok o rok świetlny. Ale po czterech latach wydaje się, że nadal mamy do czynienia z tymi samymi problemami, tylko z innego punktu widzenia. Musiałem nauczyć się architektury Hibernate , konfiguracji, rejestrowania, strategii nazewnictwa, tuplizerów, rozpoznawania nazw encji, ulepszonych generatorów identyfikatorów, optymalizacji generatora identyfikatorów, podklas union, znaczników XDoclet, dwukierunkowych skojarzeń z indeksowanymi kolekcjami, skojarzeń trójskładnikowych, idbag, mieszania niejawnego polimorfizmu z inne mapowania dziedziczenia, replikowanie obiektów między dwoma różnymi magazynami danych, odłączone obiekty i automatyczne wersjonowanie, tryby zwalniania połączeń, bezstanowy interfejs sesji, taksonomia trwałości kolekcji, poziomy pamięci podręcznej, leniwe lub gorliwe pobieranie i wiele, wiele innych. Nawet ze wszystkim, co wiem, wygląda na to, że ponieśliśmy klęskę. To fiasko oprogramowania! Ostateczna porażka! Katastrofa! Armagedon!

John - Czekaj! Co się stało?

Monica : Doszliśmy do ślepego zaułka. Wydajność naszej aplikacji jest śmiesznie niska! Na raport musimy czekać dwa dni! Dwa dni na faktyczne wygenerowanie dashboardu dla klienta. Oznacza to, że każdego dnia musimy zwiększać nasz ogon obliczeniowy, a nasz dashboard staje się coraz bardziej przestarzały. Nasz ekspert ds. DBA pracował przez dwa miesiące nad optymalizacją niektórych zapytań, podczas gdy nasza struktura bazy danych to kompletny bałagan. Są programiści, którzy go wspierają, ale problem polega na tym, że DBA myśli w SQL, a programiści spędzają dni próbując przełożyć to na oderwane kryteria lub format HQL. Staramy się jak najwięcej używać natywnego SQL, ponieważ wydajność jest w tej chwili kluczowa. W każdym razie niewiele możemy zrobić, ponieważ schemat bazy danych wydaje się po prostu błędny. Wydawało się to właściwe z perspektywy obiektowej, ale wydaje się śmieszne z perspektywy relacyjnej. Zadaję sobie pytanie: jak to się stało? Deweloperzy mówią nam, że zmiana struktury jednostek będzie ogromnym wysiłkiem, więc nie możemy sobie na to pozwolić. Pamiętam, że w poprzednim projekcie był bałagan, ale nigdy nie znaleźliśmy się w tak krytycznym punkcie. Udało nam się napisać zupełnie inną aplikację do pracy z danymi. Teraz modyfikowanie tych wygenerowanych tabel jest ryzykowne, ponieważ naprawdę trudno jest upewnić się, że model encji zawsze będzie zachowywał się prawidłowo. A to nie jest nawet najgorsza część! Aby zwiększyć wydajność, musimy rozwiązać nie tylko problemy z bazą danych, ale także z całą warstwą pomiędzy naszą bazą danych a aplikacją. To przytłaczające! Mamy tych nowych, wiesz, konsultantów. Próbują wydobyć dane, umieścić je w innej pamięci, a następnie wykonać obliczenia z zewnątrz. To wszystko zajmuje zbyt dużo czasu!

John - nie wiem co powiedzieć.

Monica - Widzisz Johna; Nie chcę cię winić. Wybrałem Hibernate , aby rozwiązać wszystkie te problemy, ale teraz dowiedziałem się, że to nie jest srebrna kula. Szkoda została wyrządzona i jest nieodwracalna. Właściwie chciałbym cię o coś zapytać: ostatnie cztery lata mojej kariery spędziłem zajmując się Hibernate . Wygląda na to, że nie mam przyszłości w mojej obecnej firmie. Możesz mi pomóc?

Więc czego się nauczyłeś?

Dziś

John : Hej, Peter, pozwól, że przedstawię Monikę.

Peter : Hej, Moniko! Budujemy naszą kolejną wielką rzecz, którą znasz. Będzie ogromny! Chcemy być jak Uber! Czy wiesz może, jak wytrwałość…

Monica - Nie hibernuj !

Zakończyć

Monica jest ekspertem od Hibernacji . Jednak Hibernate w tym przypadku był błędną decyzją. W momencie, gdy odkryła, że ​​jej rozwiązanie przerodziło się w większy problem niż oryginał, było to największe zagrożenie dla całego projektu.

Dane są głównym celem aplikacji i, czy ci się to podoba, czy nie, wpływają na całą architekturę. Jak dowiedzieliśmy się z historii, nie używaj Hibernate tylko dlatego, że twoja aplikacja Java korzysta z bazy danych lub z powodu dowodu społecznego. Wybierz rozwiązanie, które zapewnia elastyczność. Istnieje wiele opcji niezawodnych opakowań JDBC, takich jak JdbcTemplate lub Fluent JDBC Wrapper. Alternatywnie istnieją inne potężne rozwiązania, takie jak jOOQ.