Como essa é uma pergunta muito comum, escrevi
este artigo , no qual essa resposta se baseia.
Configurações a serem evitadas
Você não deve usar esta configuração:
spring.jpa.show-sql=true
O problema show-sql
é que as instruções SQL são impressas no console, portanto não há como filtrá-las, como faria normalmente com uma estrutura de Log.
Usando o log do Hibernate
No seu arquivo de configuração de log, se você adicionar o seguinte criador de logs:
<logger name="org.hibernate.SQL" level="debug"/>
Em seguida, o Hibernate imprimirá as instruções SQL quando o JDBC PreparedStatement
for criado. É por isso que a instrução será registrada usando espaços reservados para parâmetros:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
Se você deseja registrar os valores dos parâmetros de ligação, adicione também o seguinte criador de logs:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
Depois de definir o BasicBinder
criador de logs, você verá que os valores dos parâmetros de vinculação também são registrados:
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]
Usando proxy de fonte de dados
O datasource-proxy permite proxy do JDBC real DataSource
, conforme ilustrado pelo diagrama a seguir:
Você pode definir o dataSource
bean que será usado pelo Hibernate da seguinte maneira:
@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();
}
Observe que actualDataSource
deve ser o DataSource
definido pelo pool de conexões que você está usando em seu aplicativo.
Depois de ativar datasource-proxy
, a instrução SQl será registrada da seguinte maneira:
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