Оскільки це дуже поширене питання, я написав
цю статтю , на якій ґрунтується ця відповідь.
Налаштування, яких слід уникати
Ви не повинні використовувати цей параметр:
spring.jpa.show-sql=true
Проблема show-sql
полягає в тому, що оператори SQL друкуються в консолі, тому немає можливості їх фільтрувати, як це зазвичай робиться з системою Logging.
Використання режиму сплячого режиму
У файлі конфігурації журналу, якщо ви додали такий реєстратор:
<logger name="org.hibernate.SQL" level="debug"/>
Потім Hibernate надрукує оператори SQL, коли PreparedStatement
буде створено JDBC . Ось чому оператор буде реєструватися за допомогою заповнювачів параметрів:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
Якщо ви хочете записати значення параметрів прив'язки, просто додайте також наступний реєстратор:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
Після встановлення BasicBinder
реєстратора ви побачите, що значення параметрів прив'язки також реєструються:
DEBUG [main]: o.h.SQL - insert into post (title, version, id) values (?, ?, ?)
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [1] as [VARCHAR] - [High-Performance Java Persistence, part 1]
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [2] as [INTEGER] - [0]
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [3] as [BIGINT] - [1]
Використання проксі-джерела даних
DataSource-проксі дозволяє проксі фактичної JDBC DataSource
, як показано на наступній схемі:
Ви можете визначити dataSource
квасоля, яку буде використовувати Hibernate так:
@Bean
public DataSource dataSource(DataSource actualDataSource) {
SLF4JQueryLoggingListener loggingListener = new SLF4JQueryLoggingListener();
loggingListener.setQueryLogEntryCreator(new InlineQueryLogEntryCreator());
return ProxyDataSourceBuilder
.create(actualDataSource)
.name(DATA_SOURCE_PROXY_NAME)
.listener(loggingListener)
.build();
}
Зауважте, що actualDataSource
повинно бути DataSource
визначено пулом з'єднань, який ви використовуєте у своїй програмі.
Після ввімкнення datasource-proxy
оператор SQl буде реєструватися таким чином:
Name:DATA_SOURCE_PROXY, Time:6, Success:True,
Type:Prepared, Batch:True, QuerySize:1, BatchSize:3,
Query:["insert into post (title, version, id) values (?, ?, ?)"],
Params:[(Post no. 0, 0, 0), (Post no. 1, 0, 1), (Post no. 2, 0, 2)]
logging.level.org.hibernate.type=TRACE