Razni nivoi sječe u hibernaciji

1. Pregled

Budući da Hibernate za nas rješava interakciju s bazom podataka, možemo brzo razviti kôd povezan s bazom podataka. Ali, ovo može otežati otklanjanje pogrešaka povezanih s bazom podataka.

Stoga može biti korisno pregledati interakciju hibernacije s bazom podataka. Na primjer, SQL koji generira Hibernate za čitanje podataka iz tablice.

U ovom uputstvu vidjet ćemo različite razine bilježenja u hibernaciji koje se mogu koristiti za postizanje toga.

2. Zapisivanje SQL-a

Na najosnovnijoj razini možemo evidentirati SQL izraze koje je generirao Hibernate bez stvarnih vrijednosti parametara koje su mu proslijeđene.

Hibernate koristi kategoriju org.hibernate.SQL za bilježenje ovih podataka. Dakle, sve što trebamo je postaviti razinu evidentiranja ove kategorije na DEBUG.

U Log4J morat ćemo dodati a drvosječa element u XML-u konfiguracije:

Slično tome, u Log4J2 ćemo dodati Drvosječa element:

A u Logback ćemo dodati a drvosječa element:

Sada bismo generirani SQL trebali vidjeti u zapisnicima:

2019-12-07 23:04:23 | DEBUG | [glavna] o.h.SQL: 127 - umetnite u vrijednosti zaposlenika (broj zaposlenika, ime, naslov, id) (?,?,?,?) 2019-12-07 23:04:23 | DEBUG | [glavna] o.h.SQL: 127 - odaberite zaposlenik0_.id kao id1_0_, zaposlenik0_.employeeBroj kao zaposlenik2_0_, zaposlenik0_.ime kao ime3_0_, zaposlenik0_.naslov kao naslov4_0_ od zaposlenika zaposlenik0_

3. Zapisivanje vrijednosti parametara

Iako je obično generirani SQL dovoljan za identificiranje problema, ponekad bismo mogli pogledati i parametre koji se prosljeđuju u SQL izraz.

Hibernate bilježi ulazne parametre i dohvaća rezultate pomoću org.hibernate.type.descriptor.sql kategorija s razinom dnevnika TRAG. Sad, dodamo ovu kategoriju u naše konfiguracijske datoteke.

U Log4J radimo:

U Log4J2:

I na kraju, u Logback:

Slijedom toga, trebali bismo vidjeti vrijednosti parametara proslijeđene SQL izrazu, kao i rezultat izvršenja:

2019-12-07 23:04:23 | DEBUG | [glavna] o.h.SQL: 127 - umetnite u vrijednosti zaposlenika (broj zaposlenika, ime, naslov, id) (?,?,?,?) 2019-12-07 23:04:23 | TRAG | [glavna] o.h.t.d.s.BasicBinder: 64 - parametar vezanja [1] kao [VARCHAR] - [001] 2019-12-07 23:04:23 | TRAG | [glavna] o.h.t.d.s.BasicBinder: 64 - parametar vezanja [2] kao [VARCHAR] - [John Smith] 2019-12-07 23:04:23 | TRAG | [glavna] o.h.t.d.s.BasicBinder: 52 - parametar vezanja [3] kao [VARCHAR] - [null] 2019-12-07 23:04:23 | TRAG | [glavna] o.h.t.d.s.BasicBinder: 64 - parametar vezanja [4] kao [BIGINT] - [1] 2019-12-07 23:04:23 | DEBUG | [glavna] o.h.SQL: 127 - odaberite zaposlenik0_.id kao id1_0_, zaposlenik0_.employeeBroj kao zaposlenik2_0_, zaposlenik0_.ime kao ime3_0_, zaposlenik0_.titl kao naslov4_0_ od zaposlenika zaposlenik0_ 2019-12-07 23:04:23 | TRAG | [glavna] o.h.t.d.s.BasicExtractor: 60 - izvučena vrijednost ([id1_0_]: [BIGINT]) - [1] 2019-12-07 23:04:23 | TRAG | [glavna] o.h.t.d.s.BasicExtractor: 60 - izvučena vrijednost ([zaposlenik2_0_]: [VARCHAR]) - [001] 2019-12-07 23:04:23 | TRAG | [glavna] o.h.t.d.s.BasicExtractor: 60 - izvučena vrijednost ([name3_0_]: [VARCHAR]) - [John Smith] 2019-12-07 23:04:23 | TRAG | [glavna] o.h.t.d.s.BasicExtractor: 50 - izvučena vrijednost ([title4_0_]: [VARCHAR]) - [null]

Vrijedno je napomenuti da ne trebamo omogućiti org.hibernate.SQL kategoriji za prikaz gornjih podataka. Dvije kategorije možemo omogućiti i onemogućiti neovisno.

Ali, ima smisla omogućiti org.hibernate.SQL kako bismo znali na koji se SQL izraz odnose vrijednosti parametara.

4. Aktivirajte statistiku hibernacije

Osim vrijednosti parametra SQL i JDBC, Hibernate također može bilježiti statistiku za svaki SQL izraz. Ovo može biti korisno za prepoznavanje potencijalnih problema s izvedbom.

Hibernate koristi kategoriju org.hibernate.stat za bilježenje ovih podataka. No, Hibernate ne generira uvijek te statistike jer može imati loš utjecaj na izvedbu.

Prvi, moramo Hibernateu reći da generira ove statistike postavljanjem konfiguracijskog svojstva hibernate.generate_statistics do pravi.

Na primjer, ovo svojstvo možemo postaviti u svoj hibernate.cfg.xml datoteka:

pravi

Uz ovu nekretninu, postavljanje kategorije org.hibernate.stat to DEBUG prijavit će izjavu sa statistikom za svaki izvršeni upit. Također će zabilježiti jednu izjavu dnevnika s više redaka na kraju sesije koja će imati sažete statističke podatke:

2019-12-07 23:25:18 | DEBUG | [glavna] o.h.s.i.StatisticsInitiator: 101 - Inicirana statistika [omogućeno = true] 2019-12-07 23:25:19 | DEBUG | [glavna] o.h.s.i.StatisticsImpl: 729 - HHH000117: HQL: od com.baeldung.hibernate.logging.Eeeeeee, vrijeme: 22ms, redovi: 1 2019-12-07 23:25:19 | INFO | [glavna] o.h.e.i.StatisticLoggingSessionEventListener: 258 - Metrika sesije {55600 nanosekundi potrošenih na stjecanje 1 JDBC veza; 178600 nanosekundi potrošeno na oslobađanje 1 JDBC veza; 2167200 nanosekundi potrošeno na pripremu 2 JDBC izjave; Potrošeno 2426800 nanosekundi u izvršavanju 2 JDBC izraza; 0 nanosekundi provedeno u izvršavanju 0 JDBC serija; 0 nanosekundi provedeno u izvođenju 0 L2C stavljanja; 0 nanosekundi provedeno u izvođenju 0 L2C pogodaka; 0 nanosekundi provedeno izvodeći 0 promašaja L2C; 47098900 nanosekundi potrošeno izvršavajući 1 ispiranje (ispiranje ukupno 1 entiteta i 0 zbirki); 0 nanosekundi provedeno u izvršavanju 0 djelomičnih ispiranja (ispiranje ukupno 0 entiteta i 0 zbirki)}

Zabilježite prvi redak u zapisniku koji označava da su statistike omogućene.

5. Zabilježite sve aktivnosti

Da kopa još dublje u interakciju Hibernate-a s bazom podataka, morat ćemo omogućiti bilježenje kategorije org. hibernirati. Ova kategorija sadrži sve poruke koje je zabilježio Hibernate.

No, ovu kategoriju moramo koristiti s oprezom jer može stvoriti puno rezultata iz dnevnika:

6. Zaključak

U ovom uputstvu vidjeli smo različite razine bilježenja u hibernaciji. Zabilježene informacije mogu biti vrlo korisne tijekom razvoja. Moramo biti oprezni dok to omogućujemo u proizvodnji jer to može negativno utjecati na izvedbu aplikacije.

I naravno, kod koji prati ovaj vodič nalazi se na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found