JDBC VS HIBERNATE

JDBC VS HIBERNATE
0

Tak jak w temacie, który z wymienionych jest wydajniejszy ? Bardzo bym prosił o łopatologiczne wytłumaczenie ! :)

AK
U mnie google działa, u ciebie nie?
Berylo
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:344
0

W jakim sensie wydajniejszy?

0

Szybkość wykonywanych operacji.

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
3
  1. Hibernate działa na bazie JDBC
  2. Nie da się tego stwierdzić, bo wszystko zależy od tego co programista tam napisze. Generalnie na niskim poziomie oba rozwiązania opierają się o to samo, więc mogą być równie (nie)wydajne.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

Z hibernatem może być taki problem że jest dużo "magii" i jak człowiek nie ogarnia to może to łatwo wywalić. A co do Jdbc jest alternatywa np. w postaci JdbcTemplate springowego który eleminuje boilerplate code :)
Generalnie jak stosuje się ORMy to można to tez mieszać z natywnym SQLem, np. ORM się fajnie nadaje do zapisu/edytowania/kasowania encji, ale często stosowanie zwykłego SQLa może być lepsze...


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
1

Oba są tragicznie wolne. Jak chcesz szybko to nie używaj bazy danych.

Mając hibernate można łatwiej popełnić błąd i zrobić coś bardzo niewydajnego. I to nie tylko sławne n+1. Można np. spartolić equals/hascode i nieźle ubić wydajność.

Z drugiej strony w hibernate łatwiej jest zrobić cache, a jak wiadomo zwykle najszybciej to jest nie czytać nic z bazy.

Gołe Jdbc jest smutne. Są jeszcze inne alternatywy: jooq, mybatis itd.

Tak czy siak zwykle 99% pytań co jest szybsze nie ma sensu. Przy wyborze technologii nie tym się powinieneś kierować.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 5x, ostatnio: jarekr000000
Zobacz pozostały 1 komentarz
PI
@podroznik: możesz rozwinąć? Chodzi o to, że lombok wygeneruje sobie equals ai hashcoda na podstawie wszystkich pól, a my byśmy chcieli tylko na podstawie id? lub własnie na podstawie wszystkiego oprócz id?
PO
@Pinek: Generalnie chodziło o to, że kolekcje encji trzymamy w Setach a że set wykorzystuję EqualsAndHashcode to np. pobierając encję A która ma kolekcję (set) encji B. To dla set encji B musiało się wykonać equals and hashcode i jak encja B miała dużo innych kolekcji to robiło sie mnóstwo zapytań bo tam w przesłoniętych metodach były gettery a że było to w transakcji to hibernate to dociągał (problem n+1). To samo z toStringiem też były gety i że pobrane obiekty były logowane to automatycznie znowu hibernate dociągał.
PI
aaa, w ten sposób ;)
Koziołek
MyBatis/iBatis to zło w czystej postaci. Już lepiej gołe SQLe bezpośrednio w kodzie trzymać. Z doświadczenia – utrzymywalność kodu MyBatisowego jest droższa niż SQL-in-Java.
jarekr000000
@Koziołek: to zależy - sprawdza sie dobrze przy projektach gdzie SQL jest statyczny i ludzie myślą SQLem (to raczje typowe). Taki przykład to frontendy do baz danych obrabianych jeszcze przez Delphi. (Najlepszy pattern, czyli SQL jako API :/ ). Krytykowałem tego MyBatisa za prymitywność i wkurzałem się na niemieckich architektów co to narzucili, ale wyszło całkiem ok (jakbyśmy robili w JPA, które wtedy kochałem, to w jednym projekcie pewnie do dzisiaj byśmy dyskutowali jak zamapować).
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:13 dni
  • Postów:3277
0

Korzystanie z gołego JDBC pozwala na dużo swobodniejsze wykorzystanie różnych smaczków w SQL, co pozwala czasami napisać szybciej wykonujące się zapytanie, albo pominąć mapowanie do obiektów, ale to jeszcze trzeba mieć trochę doświadczenia z bazami danych, żeby coś takiego wyszło.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
1

Dodatkowo. W przypadku młodego programisty (juniora) szansa na zrobienie sobie SQL injection, przy korzystaniu z gołego JDBC wynosi 115%. W przypadku hibernate troche trudniej.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
Koziołek
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:22 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
6

Żeby zrozumieć, na czym polega różnica, należy zrozumieć, jak działają bazy danych, na poziomie komunikacji z aplikacjami. W dużym uproszczeniu każda baza danych wykorzystuje swój protokół komunikacyjny, w ramach którego przesyła zarówno zapytania SQL, parametry zapytań, jak i dane oraz metadane wyników.

####JDBC

JDBC jest specyfikacją, która opisuje w jaki sposób Java „rozumie” komunikację z bazą danych. Jednocześnie JDBC ujednolica, po stronie javy, sposób komunikacji. Implementacją JDBC są sterowniki, które zazwyczaj są pisane przez twórców baz danych. Te sterowniki widać w kodzie w momencie nawiązywania połączenia:

Kopiuj
public Connection getConnection() throws SQLException {

    Connection conn = null;
    Properties connectionProps = new Properties();
    connectionProps.put("user", this.userName);
    connectionProps.put("password", this.password);

    if (this.dbms.equals("mysql")) {
        conn = DriverManager.getConnection(
                   "jdbc:" + this.dbms + "://" +
                   this.serverName +
                   ":" + this.portNumber + "/",
                   connectionProps);
    } else if (this.dbms.equals("derby")) {
        conn = DriverManager.getConnection(
                   "jdbc:" + this.dbms + ":" +
                   this.dbName +
                   ";create=true",
                   connectionProps);
    }
    System.out.println("Connected to database");
    return conn;
}

DriverManager utworzy, bazując na tzw. connection string, połączenie, którym musimy ręcznie zarządzać.

Czym zatem jest Hibernate, czy też szerzej JPA?

To też widać w powyższym kodzie. Ale po kolei. O ile JDBC tłumaczy struktury bazodanowe takie jak wyniki (ResultSet) na proste typu danych Long, String itd. to Hibernate pozwala na kolejny krok, czyli przetłumaczenie jak pojedyncze rekordy wyników tłumaczą się na złożone obiekty. Oczywiście działa to dwukierunkowo, czyli możemy przetłumaczyć nasze obiekty na tabele w bazie danych oraz opisać, w jaki sposób referencje pomiędzy obiektami (na poziomie definicji klas) są przedstawione w bazie danych (zależności pomiędzy tabelami). Oczywiście to nie wszystko, ponieważ tego typu funkcjonalność jest dość prosta w implementacji i zazwyczaj projekty wykorzystujące JDBC w jakiś sposób implementują też mapowania. Wartością dodaną w przypadku JPA jest warstwa abstrakcji, która pozwala na zmianę bazy danych bez zmiany zapytań. Jako że bazy danych różnią się składnią SQL, to zmiana implementacji RDBMS pociągała, by konieczność przepisywania zapytań SQL (w momencie wykorzystania JDBC). Hibernate/JPA ograniczają pracę do zmiany w konfiguracji. To jak Hibernate tłumaczy model obiektowy na model w konkretnej bazie danych nazywamy dialektem. Dobrze to widać na kodzie powyżej, gdzie za pomocą ifa chcemy obsłużyć dwa różne RDBMS. Efektywnie, jeżeli nasze zapytania inaczej wyglądają w każdym z tych systemów, to musimy obsłużyć to w kodzie kolejnymi ifami (albo stosować różne kombinacje wzorców). JPA zamknie nam to w konfiguracji dialektu.
Kolejna sprawa to zarządzanie połączeniami, które jest automatycznie ogarnięte przez Hibernate oraz cache.

I na tym właśnie polega różnica:

  • JDBC opisuje, jak java komunikuje się z bazą danych i w jaki sposób typy z bazy danych mapują się na proste typy javy i dostarcza spójny interfejs do komunikacji z różnymi bazami danych, ale obsługa różnic jest po stronie programisty.
  • JPA opisuje, jaka jest zależność pomiędzy złożonymi typami po stronie javy, a tabelami i typami w bazie danych.
  • Hibernate jest implementacją JPA, która zajmuje się ogarnięciem różnic pomiędzy poszczególnymi RDBMS oraz zarządzaniem połączeniami.

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Areek
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 5 lat
  • Postów:47
0

Wybaczcie, że odkopuję ale mam pytanie w temacie: jak oceniacie czy umiejętność posługiwania się gołym jdbc przyda się nabyć w kontekście juniora?
Nie ukrywam, że do tej pory używałem JPA i nie zagłębiałem się niżej.

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Jak klepiesz CRUDa, albo generalnie potrzebujesz zmapować sobie całą bazę to spoko, JPA czesto starczy. Ale może chcesz tylko puścić jakieś ciekawe query na bazie, z grupowaniem, agregacjami etc i potem odczytać wynik do jakiegoś customowego obiektu. Wtedy JPA w niczym nie pomaga, a raczej tylko przeszkadza. Oczywiście może lepiej jakieś Spring JDBC Template a nie gołe JDBC, ale sama umiejętnośc pisania SQLa nie zaszkodzi nikomu.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Ł8
1.Można w projekcie zastosować jedno i drugie podejście żeby mieć dostęp do jednego i drugiego rozwiązania czy jest to niepraktykowane?? 2.Czy stosowane jest Insertowanie z danymi do bazy??skoro będzie się komunikować z frontem to czy potrzebne są insertowane suche dane?? 3.Jak w JDBC zmapować do dto??
Shalom
Można. Myśle że jak robisz CQRS to nawet tym bardziej. Bo często Command możesz obsłużyć jakimś JPA, a Query może wymagać złożonych operacji które lepiej zrobić SQLem czy jakimś DSLem (querydsl, jooq)
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0
Areek napisał(a):

Wybaczcie, że odkopuję ale mam pytanie w temacie: jak oceniacie czy umiejętność posługiwania się gołym jdbc przyda się nabyć w kontekście juniora?
Nie ukrywam, że do tej pory używałem JPA i nie zagłębiałem się niżej.

Do zapisów/update'ów lepszy jest ORM, do odczytów i skompilowanych raportów HQL, JPQL, typowany JOOQ lub lekki nakładki jak JDBI i JdbcTemplate. Goły JDBC to strasznie dużo klepania niepotrzebnego kodu.
Więc jak w firmie składają dużo tabel żeby zrobić raport to SQL się przyda, ale gołego JDBC lepiej unikać


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
2
Areek napisał(a):

Wybaczcie, że odkopuję ale mam pytanie w temacie: jak oceniacie czy umiejętność posługiwania się gołym jdbc przyda się nabyć w kontekście juniora?
Nie ukrywam, że do tej pory używałem JPA i nie zagłębiałem się niżej.

Rozumiem, że pytanie nie tyczy się SQL vs ORM tylko przydatność znajomości JDBC .

Odpowiedź - JDBC to dośc skomplikowany twór, gdzie trzeba pamietać o zamykaniu Statementów, utrzymywaniu puli połączeń, sprawdzaniu wasNull na ResultSet i wielu innych dziwactwach.
łatwo się pomylić i doprowadzić do wycieku zasobów lub wprowadzić podatność na SQL Injection.
Wolałbym abny juniorzy się w to nie bawili, a i seniorzy nie za często. JDBCTemplate czy inne template ze Springa i podobnych to juz dość niebezpiecznie niski poziom, niżej lepiej nie schodzić.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
nie100sowny
  • Rejestracja:około 9 lat
  • Ostatnio:około 23 godziny
  • Lokalizacja:Kraków
  • Postów:402
1

Ostatnio odkryłem jeszcze coś co się nazywa Speedment: https://speedment.com/

Disclaimer: Nie używałem tego na PROD.

Podobnie jak w JOOQ / QueryDSL generujemy API z istniejącej bazy danych. Tyle, że wygenerowane API ma formę Stream API z JDK8.

Zalety:

  • type safe API
  • brak wysiłku z kopiowaniem nazw kolumn do kodu,
  • generuje eleganckiego CRUDa (persist, merge etc.)

Wady:

  • Nie akceptuje javax.sql.DataSource tylko tworzy własną wewnętrzną pulę połączeń. Jeżeli ktoś ma skomponowane DataSource np. do monitoringu, transakcji etc. to słabo,
  • Transakcje obsługiwane są podobnie jak w Springowym TransactionTemplate,
  • Powyższe wady powodują, że nie możemy tego dodać transparentnie do aplikacji Springowej.

title


"Gdy się nie wie, co się robi, to się dzieją takie rzeczy, że się nie wie, co się dzieje"
edytowany 2x, ostatnio: nie100sowny
Shalom
Trochę bym sie tego bał, bo to taki sam problem jak z JPA -> ludzie przestaja myśleć o tym że pod spodem jest baza i kończy sie to tragicznie jakimiś n+1 select
Koziołek
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:22 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
1

JDBC jako takie warto poznać, nawet będąc juniorem. Kwestia tego, żeby nie robić wielkich oczu, jak zobaczy się kawałek kodu. Trochę innym zagadnieniem i mam wrażenie, że to jest sens pytania, to znajomość SQLa. Ta jest wymagana na poziomie co najmniej podstawowym już na początku zabawy z programowaniem za pieniądze.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Belka
  • Rejestracja:prawie 8 lat
  • Ostatnio:6 dni
  • Lokalizacja:PL
  • Postów:452
0
jarekr000000 napisał(a):

Mając hobernate można łatwiej popełnić błąd i zrobić coś bardzo niewydajnego. I to nie tylko sławne n+1. Można np. spartolić equals/hascode i nieźle ubić wydajność.

Co masz na myśli wspominając o tym equals/hashcode?

Koziołek
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:22 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
2

@Belka: Hibernate/JPA wykorzystuje equals i hashCode w wielu operacjach związanych z porównywaniem encji. Zła (typowa) implementacja tych metod może spowodować dużo problemów. Począwszy od spadku wydajności, poprzez nieprawidłowe wyszukiwania, a na wielokrotnych insertach tych samych encji kończąc. Ładnie opisane tutaj


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Belka
Dzieki! Obejrze sobie
PerlMonk
obejrzę, kufa!
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Hibernate:

  • wygodniejsze API
  • wersjonowanie encji i blokowanie zapisu przy probie nadpisania czyjejs zmiany
  • auto-wykrywanie zmian i aktualizacja tylko wybranych pol
  • Criteria. API pomaga gdy masz wygenerowac rozme warunki w tym samym miejscu w zaleznosci od parametrow wejscia ( jest to malo czytelne ale bezpieczne)

JDBC:

  • wygodniejsze API do zlozonych raportow (agregacje, zagniezdzenia)
  • latwiejsze do nauki dla juniora
  • bezposrednia kontrola zapytan SQL (czyli ich postac jest gwarantowana) - to jest przydatne gdy chcemy optymalizowac po stronie bazy
Koziołek
Criteria API jest czytelne, tylko nikomu nie chce się tego porządnie pisać.
jarekr000000
Co do łatwiejsze do nauki JDBC to nie wiem - np. ile razy naciąleś się na to? https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#wasNull-- 20 lat temu się śmiałem, że to tak głupie, że nie da się o tym zapomnieć i nadal każde dłuższe spotkanie z JDBC (raz na 4 lata) owocuje jakąś drobną wywałką na nullach.
vpiotr
@jarekr000000: Na mainframe/COBOL nulle trzeba bylo wykrywac w osobnym polu (null indicator czy jakos tak) wiec nie widzialem w tym zadnego problemu.
WA
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:9
0

@nie100sowny:
Fajne narzedzie. Uzywalisny kiedys. Zdecydowanie najszybsze i ladne. Nawet szybsze od sqla niekiedy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.