Различни нива на дърводобив в хибернация

1. Общ преглед

Тъй като Hibernate обработва взаимодействието с базата данни за нас, ние можем бързо да разработим код, свързан с базата данни. Но това може да затрудни отстраняването на грешки, свързани с базата данни.

Следователно може да бъде полезно да се види взаимодействието на Hibernate с базата данни. Например SQL, генериран от Hibernate за четене на данни от таблица.

В този урок ще видим различните нива на регистриране в Hibernate, които могат да се използват за постигане на това .

2. Регистрация на SQL

На най-основното ниво можем да регистрираме SQL изразите, генерирани от Hibernate, без действителните стойности на параметри, предадени към него.

Hibernate използва категорията org.hibernate.SQL, за да регистрира тази информация. И така, всичко, което трябва да направим, е да зададем нивото на регистриране на тази категория на DEBUG.

В Log4J ще трябва да добавим елемент регистратор в конфигурационния XML:

По същия начин в Log4J2 ще добавим елемент Logger :

И в Logback ще добавим елемент на регистратор :

Сега трябва да видим генерирания SQL в дневниците:

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. Регистрация на стойности на параметри

Въпреки че обикновено генерираният SQL е достатъчен за идентифициране на проблеми, понякога бихме могли да разгледаме и параметрите, предавани на SQL израза.

Хибернацията регистрира входните параметри и извлича резултатите, като използва категорията org.hibernate.type.descriptor.sql с ниво на регистрация TRACE . Сега, нека добавим тази категория към нашите конфигурационни файлове.

В Log4J правим:

В Log4J2:

И накрая, в Logback:

Следователно трябва да видим стойностите на параметрите, предадени на SQL израза, както и резултата от изпълнението:

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]

Заслужава да се отбележи, че не е необходимо да активираме категорията org.hibernate.SQL, за да видим горната информация. Можем да активираме и деактивираме двете категории независимо .

Но има смисъл да активирате org.hibernate.SQL , за да знаем към кой SQL израз се отнасят стойностите на параметрите .

4. Активирайте Статистика за хибернация

Освен стойностите на SQL и параметрите JDBC, Hibernate може да регистрира и статистически данни за всеки SQL оператор. Това може да бъде полезно за идентифициране на потенциални проблеми с производителността.

Hibernate използва категорията org.hibernate.stat, за да регистрира тази информация. Но Hibernate не винаги генерира тази статистика, защото може да окаже лошо влияние върху производителността.

Първо, трябва да кажем на Hibernate да генерира тези статистически данни, като зададем свойството за конфигурация hibernate.generate_statistics на true .

Например можем да зададем това свойство в нашия файл hibernate.cfg.xml :

true

Заедно с това свойство, задаването на категорията org.hibernate.stat на DEBUG ще регистрира отчет със статистическите данни за всяка изпълнена заявка . Той също така ще регистрира един многоредов протокол в края на сесията, който ще има обобщена статистическа информация:

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) }

Обърнете внимание на първия ред в дневника, който показва, че статистиката е активирана.

5. Регистрирайте цялата активност

За да се задълбочим още повече във взаимодействието на Hibernate с базата данни, ще трябва да активираме регистриране за категорията org.hibernate . Тази категория съдържа всички съобщения, регистрирани от Hibernate.

Но ние трябва да използваме тази категория с повишено внимание, тъй като тя може да създаде много изходни данни в дневника:

6. Заключение

В този урок видяхме различните нива на регистриране в Hibernate. Записаната информация може да бъде много полезна по време на разработката. Но трябва да внимаваме, докато разрешаваме това в производството, тъй като това може да повлияе неблагоприятно на производителността на приложението.

И разбира се, кодът, придружаващ този урок, може да бъде намерен в GitHub.