Berbagai Tingkat Penebangan dalam mode Hibernasi

1. Ikhtisar

Karena Hibernate menangani interaksi dengan database untuk kami, kami dapat mengembangkan kode terkait database dengan cepat. Namun, hal ini dapat mempersulit proses debug kegagalan terkait database.

Oleh karena itu, akan berguna untuk melihat interaksi Hibernate dengan database. Misalnya, SQL dihasilkan oleh Hibernate untuk membaca data dari tabel.

Dalam tutorial ini, kita akan melihat berbagai level logging di Hibernate yang dapat digunakan untuk mencapai ini .

2. Logging SQL

Pada tingkat paling dasar, kita dapat mencatat pernyataan SQL yang dihasilkan oleh Hibernate tanpa nilai parameter aktual yang diteruskan kepadanya.

Hibernate menggunakan kategori org.hibernate.SQL untuk mencatat informasi ini. Jadi, yang harus kita lakukan adalah menyetel tingkat logging kategori ini ke DEBUG.

Di Log4J, kita harus menambahkan elemen logger di konfigurasi XML:

Demikian pula, di Log4J2, kami akan menambahkan elemen Logger :

Dan, di Logback, kami akan menambahkan elemen logger :

Kita sekarang harus melihat SQL yang dihasilkan di 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 Logging

Meskipun biasanya SQL yang dihasilkan cukup untuk mengidentifikasi masalah, terkadang kita mungkin juga ingin melihat parameter yang diteruskan ke pernyataan SQL.

Hibernasi mencatat parameter input dan mengambil hasil menggunakan kategori org.hibernate.type.descriptor.sql dengan tingkat log TRACE . Sekarang, mari tambahkan kategori ini ke file konfigurasi kita.

Di Log4J kami melakukan:

Di Log4J2:

Dan terakhir, di Logback:

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

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 dicatat bahwa kami tidak perlu mengaktifkan kategori org.hibernate.SQL untuk melihat informasi di atas. Kami dapat mengaktifkan dan menonaktifkan dua kategori secara independen .

Tapi, masuk akal untuk mengaktifkan org.hibernate.SQL sehingga kita tahu pernyataan SQL mana yang terkait dengan nilai parameter .

4. Aktifkan Statistik Hibernasi

Selain SQL dan nilai parameter JDBC, Hibernate juga dapat mencatat statistik untuk setiap pernyataan SQL. Ini dapat berguna untuk mengidentifikasi potensi masalah kinerja.

Hibernate menggunakan kategori org.hibernate.stat untuk mencatat informasi ini. Namun, Hibernate tidak selalu menghasilkan statistik ini karena dapat berdampak buruk pada kinerja.

Pertama, kita harus memberi tahu Hibernate untuk menghasilkan statistik ini dengan menyetel properti konfigurasi hibernate.generate_statistics ke true .

Misalnya, kita dapat mengatur properti ini di file hibernate.cfg.xml kita :

true

Bersamaan dengan properti ini, menyetel kategori org.hibernate.stat ke DEBUG akan mencatat pernyataan dengan statistik untuk setiap kueri yang dijalankan . Ini juga akan mencatat satu pernyataan log multi-baris di akhir sesi yang akan meringkas informasi 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 di log yang menunjukkan bahwa statistik diaktifkan.

5. Catat Semua Aktivitas

Untuk menggali lebih dalam tentang interaksi Hibernate dengan database, kita harus mengaktifkan logging untuk kategori org.hibernate . Kategori ini berisi semua pesan yang dicatat oleh Hibernate.

Namun, kita harus menggunakan kategori ini dengan hati-hati karena dapat menghasilkan banyak keluaran log:

6. Kesimpulan

Dalam tutorial ini, kami melihat berbagai level logging di Hibernate. Informasi yang dicatat bisa sangat berguna selama pengembangan. Namun, kami harus berhati-hati saat mengaktifkannya dalam produksi karena dapat berdampak buruk pada kinerja aplikasi.

Dan tentu saja, kode yang menyertai tutorial ini dapat ditemukan di GitHub.