Pelbagai Tahap Pembalakan di Hibernate

1. Gambaran keseluruhan

Oleh kerana Hibernate menangani interaksi dengan pangkalan data untuk kami, kami dapat mengembangkan kod yang berkaitan dengan pangkalan data dengan cepat. Tetapi, ini boleh menjadikan kegagalan berkaitan pangkalan data debug menjadi sukar.

Oleh itu, adalah berguna untuk melihat interaksi Hibernate dengan pangkalan data. Sebagai contoh, SQL yang dihasilkan oleh Hibernate untuk membaca data dari jadual.

Dalam tutorial ini, kita akan melihat pelbagai tahap log masuk di Hibernate yang boleh digunakan untuk mencapainya .

2. Log masuk SQL

Pada tahap paling asas, kita dapat mencatat penyataan SQL yang dihasilkan oleh Hibernate tanpa nilai parameter sebenar yang diteruskan kepadanya.

Hibernate menggunakan kategori org.hibernate.SQL untuk log maklumat ini. Jadi, yang perlu kita lakukan adalah menetapkan tahap pembalakan kategori ini ke DEBUG.

Di Log4J, kita perlu menambahkan elemen logger dalam konfigurasi XML:

Begitu juga, dalam Log4J2, kami akan menambahkan elemen Logger :

Dan, dalam Log Balik, kami akan menambahkan elemen logger :

Kita sekarang harus melihat SQL yang dihasilkan dalam log:

2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL:127 - insert into Employee (employeeNumber, name, title, id) values (?, ?, ?, ?) 2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL:127 - select employee0_.id as id1_0_, employee0_.employeeNumber as employee2_0_, employee0_.name as name3_0_, employee0_.title as title4_0_ from Employee employee0_

3. Nilai Parameter Pembalakan

Walaupun biasanya SQL yang dihasilkan cukup untuk mengenal pasti masalah, kadang-kadang kita mungkin juga ingin melihat parameter yang diteruskan ke pernyataan SQL.

Hibernate mencatat parameter input dan hasil yang diambil menggunakan kategori org.hibernate.type.descriptor.sql dengan tahap log TRACE . Sekarang, mari tambahkan kategori ini ke fail konfigurasi kami.

Di Log4J kita melakukan:

Dalam Log4J2:

Dan akhirnya, dalam Log Balik:

Akibatnya, kita harus melihat nilai parameter yang diteruskan ke pernyataan SQL serta hasil pelaksanaannya:

2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL:127 - insert into Employee (employeeNumber, name, title, id) values (?, ?, ?, ?) 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder:64 - binding parameter [1] as [VARCHAR] - [001] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder:64 - binding parameter [2] as [VARCHAR] - [John Smith] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder:52 - binding parameter [3] as [VARCHAR] - [null] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicBinder:64 - binding parameter [4] as [BIGINT] - [1] 2019-12-07 23:04:23 | DEBUG | [main] o.h.SQL:127 - select employee0_.id as id1_0_, employee0_.employeeNumber as employee2_0_, employee0_.name as name3_0_, employee0_.title as title4_0_ from Employee employee0_ 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor:60 - extracted value ([id1_0_] : [BIGINT]) - [1] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor:60 - extracted value ([employee2_0_] : [VARCHAR]) - [001] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor:60 - extracted value ([name3_0_] : [VARCHAR]) - [John Smith] 2019-12-07 23:04:23 | TRACE | [main] o.h.t.d.s.BasicExtractor:50 - extracted value ([title4_0_] : [VARCHAR]) - [null]

Perlu diingat bahawa kita tidak perlu mengaktifkan kategori org.hibernate.SQL untuk melihat maklumat di atas. Kami boleh mengaktifkan dan mematikan dua kategori secara bebas .

Tetapi, ia masuk akal untuk membolehkan org.hibernate.SQL supaya kita tahu yang SQL kenyataan itu nilai-nilai parameter berkaitan dengan .

4. Aktifkan Statistik Hibernate

Selain dari nilai parameter SQL dan JDBC, Hibernate juga dapat mencatat statistik untuk setiap pernyataan SQL. Ini berguna untuk mengenal pasti masalah prestasi yang berpotensi.

Hibernate menggunakan kategori org.hibernate.stat untuk log maklumat ini. Tetapi, Hibernate tidak selalu menghasilkan statistik ini kerana boleh mempengaruhi prestasi.

Pertama, kita harus memberitahu Hibernate untuk menghasilkan statistik ini dengan menetapkan hibernate.generate_statistics sifat konfigurasi menjadi benar .

Sebagai contoh, kita boleh menetapkan harta ini dalam fail hibernate.cfg.xml kami :

true

Bersama dengan harta tanah ini, menetapkan kategori org.hibernate.stat ke DEBUG akan mencatat kenyataan dengan statistik untuk setiap pertanyaan yang dilaksanakan . Ia juga akan mencatat satu penyataan log berbilang baris pada akhir sesi yang akan merangkum maklumat statistik:

2019-12-07 23:25:18 | DEBUG | [main] o.h.s.i.StatisticsInitiator:101 - Statistics initialized [enabled=true] 2019-12-07 23:25:19 | DEBUG | [main] o.h.s.i.StatisticsImpl:729 - HHH000117: HQL: from com.baeldung.hibernate.logging.Employee, time: 22ms, rows: 1 2019-12-07 23:25:19 | INFO | [main] o.h.e.i.StatisticalLoggingSessionEventListener:258 - Session Metrics { 55600 nanoseconds spent acquiring 1 JDBC connections; 178600 nanoseconds spent releasing 1 JDBC connections; 2167200 nanoseconds spent preparing 2 JDBC statements; 2426800 nanoseconds spent executing 2 JDBC statements; 0 nanoseconds spent executing 0 JDBC batches; 0 nanoseconds spent performing 0 L2C puts; 0 nanoseconds spent performing 0 L2C hits; 0 nanoseconds spent performing 0 L2C misses; 47098900 nanoseconds spent executing 1 flushes (flushing a total of 1 entities and 0 collections); 0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections) }

Perhatikan baris pertama dalam log yang menunjukkan bahawa statistik diaktifkan.

5. Log Semua Aktiviti

Untuk menggali lebih mendalam mengenai interaksi Hibernate dengan pangkalan data, kita mesti mengaktifkan log masuk untuk kategori org.hibernate . Kategori ini mengandungi semua mesej yang dicatat oleh Hibernate.

Tetapi, kita mesti menggunakan kategori ini dengan berhati-hati kerana mungkin menghasilkan banyak output log:

6. Kesimpulannya

Dalam tutorial ini, kami melihat tahap log masuk yang berlainan di Hibernate. Maklumat yang dicatat sangat berguna semasa pembangunan. Tetapi, kita harus berhati-hati semasa mengaktifkannya dalam pengeluaran kerana boleh mempengaruhi prestasi aplikasi.

Dan tentu saja, kod yang menyertai tutorial ini boleh didapati di GitHub.