Poiché questa è una domanda molto comune, ho scritto
questo articolo , su cui si basa questa risposta.
Impostazioni da evitare
Non dovresti usare questa impostazione:
spring.jpa.show-sql=true
Il problema show-sql
è che le istruzioni SQL sono stampate nella console, quindi non c'è modo di filtrarle, come faresti normalmente con un framework di registrazione.
Utilizzo della registrazione ibernata
Nel tuo file di configurazione del registro, se aggiungi il seguente logger:
<logger name="org.hibernate.SQL" level="debug"/>
Quindi, Hibernate stamperà le istruzioni SQL quando PreparedStatement
viene creato JDBC . Ecco perché l'istruzione verrà registrata utilizzando i segnaposto dei parametri:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
Se si desidera registrare i valori dei parametri di bind, aggiungere anche il seguente logger:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
Una volta impostato il BasicBinder
logger, vedrai che vengono registrati anche i valori dei parametri di bind:
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]
Utilizzo del proxy dell'origine dati
Il proxy dell'origine dati consente di eseguire il proxy del JDBC effettivo DataSource
, come illustrato dal diagramma seguente:
È possibile definire il dataSource
bean che verrà utilizzato da Hibernate come segue:
@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();
}
Si noti che actualDataSource
deve essere DataSource
definito dal pool di connessioni che si sta utilizzando nella propria applicazione.
Una volta abilitato datasource-proxy
, l'istruzione SQl verrà registrata come segue:
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