Ponieważ jest to bardzo częste pytanie, napisałem
ten artykuł , na którym opiera się ta odpowiedź.
Ustawienia, których należy unikać
Nie należy używać tego ustawienia:
spring.jpa.show-sql=true
Problem show-sql
polega na tym, że instrukcje SQL są drukowane w konsoli, więc nie ma możliwości ich filtrowania, jak to zwykle bywa ze strukturą rejestrowania.
Korzystanie z rejestrowania hibernacji
Jeśli dodasz następujący rejestrator w pliku konfiguracyjnym dziennika:
<logger name="org.hibernate.SQL" level="debug"/>
Następnie Hibernacja wydrukuje instrukcje SQL podczas tworzenia JDBC PreparedStatement
. Dlatego instrukcja będzie rejestrowana przy użyciu symboli zastępczych parametrów:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
Jeśli chcesz rejestrować wartości parametrów wiązania, dodaj również następujący rejestrator:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
Po ustawieniu BasicBinder
rejestratora zobaczysz, że rejestrowane są również wartości parametrów wiązania:
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]
Korzystanie z źródła danych proxy
Źródło danych proxy pozwala na proxy rzeczywistego JDBC DataSource
, jak pokazano na poniższym diagramie:
Możesz zdefiniować dataSource
fasolę, która będzie używana przez Hibernację w następujący sposób:
@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();
}
Zauważ, że actualDataSource
musi to być DataSource
zdefiniowany przez pulę połączeń, której używasz w swojej aplikacji.
Po włączeniu datasource-proxy
instrukcja SQl będzie rejestrowana w następujący sposób:
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