Puisque c'est une question très courante, j'ai écrit
cet article , sur lequel cette réponse est basée.
Paramètres à éviter
Vous ne devez pas utiliser ce paramètre:
spring.jpa.show-sql=true
Le problème show-sql
est que les instructions SQL sont imprimées dans la console, il n'y a donc aucun moyen de les filtrer, comme vous le feriez normalement avec un cadre de journalisation.
Utilisation de la journalisation Hibernate
Dans votre fichier de configuration de journal, si vous ajoutez l'enregistreur suivant:
<logger name="org.hibernate.SQL" level="debug"/>
Ensuite, Hibernate imprimera les instructions SQL lors de la création du JDBC PreparedStatement
. C'est pourquoi l'instruction sera enregistrée à l'aide des espaces réservés de paramètre:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
Si vous souhaitez enregistrer les valeurs des paramètres de liaison, ajoutez simplement également l'enregistreur suivant:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
Une fois que vous avez défini l' BasicBinder
enregistreur, vous verrez que les valeurs des paramètres de liaison sont également enregistrées:
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]
Utilisation de proxy de source de données
Le proxy de source de données vous permet de proxy le JDBC réel DataSource
, comme illustré par le diagramme suivant:
Vous pouvez définir le dataSource
bean qui sera utilisé par Hibernate comme suit:
@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();
}
Notez que le actualDataSource
doit être DataSource
défini par le pool de connexions que vous utilisez dans votre application.
Une fois que vous l'activez datasource-proxy
, l'instruction SQl va être enregistrée comme suit:
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