Como esta es una pregunta muy común, escribí
este artículo , en el que se basa esta respuesta.
Configuraciones para evitar
No debe usar esta configuración:
spring.jpa.show-sql=true
El problema show-sql
es que las instrucciones SQL se imprimen en la consola, por lo que no hay forma de filtrarlas, como lo haría normalmente con un marco de registro.
Usar el registro de Hibernate
En su archivo de configuración de registro, si agrega el siguiente registrador:
<logger name="org.hibernate.SQL" level="debug"/>
Luego, Hibernate imprimirá las declaraciones SQL cuando PreparedStatement
se cree el JDBC . Es por eso que la declaración se registrará utilizando marcadores de posición de parámetros:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
Si desea registrar los valores de los parámetros de enlace, simplemente agregue también el siguiente registrador:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
Una vez que configure el BasicBinder
registrador, verá que los valores de los parámetros de enlace también se registran:
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]
Usar datasource-proxy
El proxy de origen de datos le permite proxy el JDBC real DataSource
, como se ilustra en el siguiente diagrama:
Puede definir el dataSource
bean que utilizará Hibernate de la siguiente manera:
@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();
}
Tenga en cuenta que actualDataSource
debe ser el DataSource
definido por el grupo de conexiones que está utilizando en su aplicación.
Una vez que habilite datasource-proxy
, la instrucción SQl se registrará de la siguiente manera:
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