Поскольку это очень распространенный вопрос, я написал
эту статью , на которой основан этот ответ.
Настройки, чтобы избежать
Вы не должны использовать этот параметр:
spring.jpa.show-sql=true
Проблема show-sql
в том, что операторы SQL печатаются в консоли, поэтому нет способа их фильтровать, как вы это обычно делаете с каркасом Logging.
Использование журнала Hibernate
В вашем файле конфигурации журнала, если вы добавите следующий регистратор:
<logger name="org.hibernate.SQL" level="debug"/>
Затем Hibernate напечатает операторы SQL при создании JDBC PreparedStatement
. Вот почему оператор будет записываться с использованием заполнителей параметров:
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-proxy
DataSource-прокси позволяет прокси фактической JDBC DataSource
, как показано на следующей схеме:
Вы можете определить dataSource
bean-компонент, который будет использоваться 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