JDBC VS HIBERNATE

0

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

0

W jakim sensie wydajniejszy?

0

Szybkość wykonywanych operacji.

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.
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...

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ć.

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.

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.

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:

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.
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0