Da dies eine sehr häufige Frage ist, habe ich
diesen Artikel geschrieben , auf dem diese Antwort basiert.
Zu vermeidende Einstellungen
Sie sollten diese Einstellung nicht verwenden:
spring.jpa.show-sql=true
Das Problem dabei show-sql
ist, dass die SQL-Anweisungen in der Konsole gedruckt werden, sodass es keine Möglichkeit gibt, sie zu filtern, wie Sie es normalerweise mit einem Protokollierungsframework tun würden.
Verwenden der Protokollierung im Ruhezustand
Wenn Sie in Ihrer Protokollkonfigurationsdatei den folgenden Protokollierer hinzufügen:
<logger name="org.hibernate.SQL" level="debug"/>
Anschließend druckt Hibernate die SQL-Anweisungen, wenn der JDBC PreparedStatement
erstellt wird. Aus diesem Grund wird die Anweisung mithilfe von Parameterplatzhaltern protokolliert:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
Wenn Sie die Bindungsparameterwerte protokollieren möchten, fügen Sie einfach den folgenden Logger hinzu:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
Sobald Sie den BasicBinder
Logger eingestellt haben, sehen Sie, dass auch die Bindungsparameterwerte protokolliert werden:
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]
Datenquellen-Proxy verwenden
Mit dem Datenquellen-Proxy können Sie den tatsächlichen JDBC DataSource
als Proxy verwenden , wie in der folgenden Abbildung dargestellt:
Sie können die dataSource
Bean, die von Hibernate verwendet wird, wie folgt definieren:
@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();
}
Beachten Sie, dass die actualDataSource
muss die werden DataSource
durch die definierte Verbindungspool Sie sind in Ihrer Anwendung verwenden.
Nach dem Aktivieren datasource-proxy
wird die SQl-Anweisung wie folgt protokolliert:
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